第一篇 基础篇
第1章MySQL基本介绍
1.0 引言
作为最为流行的开源数据库软件之一,MySQL数据库软件已经广为人知了。但是为了照顾对MySQL还不熟悉的读者,本章将对MySQL做简单的介绍。主要内容包括MySQL各功能模块的组成,各模块协同工作的原理,Query处理流程的详细分析等。可以帮助读者清晰地理解MySQL的原理机制,定位数据库的各类问题。
1.1 MySQL Server简介
1.1.1 什么是MySQL
MySQL是由原MySQL AB公司自主研发的,是目前IT行业最流行的开放源代码的数据库管理系统,同时它也是一个支持多线程高并发多用户的关系型数据库管理系统。
MySQL数据库以其简单、高效、可靠的特点,短短几年的时间就从一个名不见经传的数据库系统变成一个在IT行业几乎无人不知的开源数据库管理系统。从微型的嵌入式系统到中小型的Web网站,至大型的企业级应用,到处都可见其身影。为何一个开源的数据库管理系统会变得如此流行呢?我在2003 年第一次接触MySQL之前,也非常纳闷。不过,或许在我向您大概地介绍其发展历程之后,您心中的这个问题就会消失了。
1.1.2 艰难诞生
1985年,瑞典几位志同道合的小伙子(以David Axmark为首)成立了一家公司,这就是MySQL AB的前身。这家公司最初并不是为了开发数据库产品,而是因为在实现其他目标的过程中,需要一个数据库。他们希望能够使用开源的产品,但当时并没有合适的选择,于是就自己开发。
在最初,他们只是设计了一个利用索引顺序存取数据的方法,也就是ISAM(Indexed Sequential Access Method)存储引擎核心算法的前身,并结合mSQL来实现自己的应用需求。在早期,他们主要为瑞典的一些大型零售商提供数据仓库服务。在系统使用过程中,随着数据量越来越大,系统复杂度越来越高,ISAM和mSQL的组合逐渐不堪重负。在分析性能瓶颈之后,他们发现问题出在mSQL上面。不得已,他们抛弃了mSQL,重新开发了一套功能类似的数据存储引擎,这就是ISAM存储引擎。刚才已经谈到他们主要为零售商提供数据仓库服务,想必您也容易理解为什么直至现在,MySQL最擅长的是查询性能,而不是事务处理了(须要借助第三方存储引擎)。
软件诞生,自然该取一个好听并且容易记住的名字。不过至今,MySQL AB仍然没有公布当初为什么给这个数据库系统取名为MySQL。据传MySQL取自创始人之一Monty Widenius女儿的名字,或许大家会认为这仅仅是我的猜测,其实这也并不是完全没有根据。读者或许知道目前正处于研发的用来替代MyISAM存储引擎的新一代存储引擎产品Maria,为什么叫Maria? 笔者曾经和MySQL前CTO David有过这方面的沟通,得到的答案是,Maria是以他小女儿的名字命名的。或许这是几位MySQL创始人为软件命名的一个喜好吧。
在MySQL诞生之初,其功能还非常粗糙,和当时已经成熟稳定运营多年的商业数据库管理系统完全不能比。MySQL之所以能够成功,和几个创始人最初采用的策略关系非常大。
1.1.3 寻求发展
MySQL诞生的时候,正是互联网开始高速发展的时期。MySQL AB通过优化MySQL满足了互联网开发者对数据库产品的需求:标准化查询语言的支持,高效的数据存取,不必关注事务完整性,简单易用,而且成本低廉。当时大量的小公司都愿意采用MySQL作为数据库应用系统的数据库管理系统,所以MySQL的用户数量不断地增长,进一步促进了MySQL自身不断地改进和完善,进入了良性循环。
合理地把握需求,准确地定位目标客户,为MySQL后面的发展铺平了道路。可以看到,MySQL一开始就没有拿大型数据库应用系统做为自身的目标,更没有将所有的IT行业定位为自己的目标用户,而是选择了当时并不受重视的一小部分Web开发者作为自己的客户来重点培养发展。这种做法或许值得其他IT企业学习。
1.1.4 巨人崛起
可以说,正是MySQL最初抓住了互联网客户,造就了今天MySQL在互联网行业的巨大成功。当然,MySQL能高速发展,离不开另外一个很关键的因素,那就是开放源代码。
在2000年的时候,MySQL公布了自己的源代码,并采用GPL(GNU General Public License)许可协议,正式进入开源世界。虽然在当时的环境下,开源还没有现在这样流行,但那是开源世界真正开始让大多数世人所接受并开始推崇的起步阶段。当然MySQL的成功并不仅仅是因为以上这些原因,但不能否认正是MySQL这一战略性质的策略让它在进一步拓展自己客户群的路上一路顺风。MySQL此后的发展路程我想就不须要继续啰嗦了,基本上都可以从MySQL的官方网站(http://www.mysql.com)得到相应的答案。
1.2 MySQL与其他数据库的简单比较
前面简单介绍了MySQL的发展历程,并从中了解了MySQL快速崛起的必要条件。接下来,我们在功能、性能,以及其易用性方面将MySQL和其他主流的数据库做一个基本的比较,从而了解MySQL成为当下最流行的开源数据库软件的充分条件。
1.2.1 功能比较
作为一个成熟的数据库管理系统,要满足各种各样的商业需求,功能肯定是会被列入重点参考对象的。MySQL的早期版本功能非常简单,只能做一些很基础的结构化数据存取操作,但是经过多年的改进和完善之后,现在它已经基本具备了所有通用数据库管理系统需要的相关功能。
MySQL基本实现了ANSI SQL 92的大部分标准,仅有少部分并不经常被使用的没有实现。比如在字段类型支持方面,另一个著名的开源数据库PostgreSQL支持的类型是最完整的,而Oracle和其他一些商业数据库(比如DB2、Sybase等)较MySQL要相对少一些。这一点,我们可以通过TCX的Crash-me测试套件得出的测试报告得知。在事务支持方面,虽然MySQL自己的存储引擎并没有提供,但是已经通过第三方插件式存储引擎InnoDB实现了SQL 92标准定义的4个事务隔离级别的全部,只是在实现的过程中每一种引擎的实现方式可能有一定的区别,这在当前商用数据库管理系统中并不多见。比如,大名鼎鼎的Oracle数据库就仅仅实现了其中的两种(Serializable和Read Commited),而PostgreSQL支持4种隔离级别。
不过在可编程支持方面,MySQL和其他数据库相比还有一定的差距,虽然最新版的MySQL已经开始提供一些简单的可编程支持,如开始支持Procedure、Function、Trigger等,但是所支持的功能还比较有限,和其他几大商用数据库管理系统相比,还存在较大的不足。如Oracle有强大的PL/SQL,SQL Server有T-SQL,PostgreSQL也有功能很完善的PL/PGSQL的支持。
整体来说,虽然在功能方面MySQL数据库作为一个通用的数据库管理系统暂时还无法和PostgreSQL相比,但是其功能完全可以满足我们的通用商业需求,提供足够强大的服务。而且不管是哪一种数据库在功能方面都不敢声称自己比其他任何一款商用数据库管理系统都强,甚至都不敢声称能够拥有某类数据库产品的所有功能。因为每一款数据库管理系统都有自身的优势,也有自身的局限,这都说明每一款产品重点服务的方向不一样。
1.2.2 易用性比较
从系统易用性方面来比较,每一个使用过MySQL的用户都能够明显地感觉出MySQL在这方面的优势所在,尤其是相对于一些大型的商业数据库管理系统,如Oracle、DB2及Sybase。对于普通用户来说,它们的操作难易程度明显不处于一个级别。MySQL一直都奉行简单易用的原则,也正是靠这一特性吸引了大量的初级数据库用户。这一批又一批的初级用户,在经过了几年的成长之后,很多都已经成为了高级数据库用户,而且也一直都在伴随着MySQL成长。
从安装方面来说,MySQL安装包大小仅100MB左右,与那几大商业数据库相比完全不是一个数量级。它的安装也比Oracle等商业数据库容易很多,不论是通过已经编译好的二进制分发包,还是通过源码编译安装,都非常简单。
再从数据库创建方面来比较,MySQL仅仅需要一个简单的CREATE DATABASE命令即可在瞬间完成建库的动作,而Oracle数据库与之相比,创建一个数据库简直就是一个庞大的工程。当然,二者在概念上存在一定差别也不可否认。
1.2.3 性能比较
性能高一直是MySQL引以自豪的一个特点。在权威的第三方评测机构多次测试比较各种数据库TPCC值的过程中,MySQL一直都有非常优异的表现,而且在其他所有商用的通用数据库管理系统中,仅仅有Oracle数据库能够与其一较高下。至于各种数据库详细的性能数据,这里就不再介绍,大家完全可以通过网上第三方评测机构公布的数据了解具体细节信息。
MySQL一直以来奉行一个原则,那就是在保证足够稳定性的前提下,尽可能地提高自身的处理能力。也就是说,在性能和功能方面,MySQL第一考虑的要素主要还是性能,MySQL希望能够在满足客户99%的需求的前提下,将剩余的所有精力都用来努力提高系统性能,而不希望自己是一个比其他任何数据库的功能都要强大的产品。
1.2.4 可靠性
关于可靠性的比较,并没有太多详细的评测比较数据,但是从目前业界的反映中可以了解到,几大商业厂商的数据库之可靠性肯定是没有太多问题的。但是作为开源数据库管理系统的代表,MySQL也有非常优异的表现,而并不是像有些人心中所怀疑的那样,以为不是商业厂商提供,就会不够稳定、不够健壮。从当前最火的Facebook这样大型的网站都是使用MySQL数据库就可以看出,MySQL在稳定可靠性方面,并不会比商业厂商的产品逊色太多。而且排在全球前10位的大型网站里面,大部分都有部分业务是运行在MySQL数据库环境上的,如Yahoo、Google等。
总体来说,MySQL数据库在发展过程中一直追求三项原则:简单、高效、可靠。从上面简单的比较中也可以看出,MySQL在这三项原则上面,没有哪一项是做得不好的。而且,虽然功能并不是MySQL自身追求的原则之一,但是考虑到当前用户量急剧增长,用户需求越来越多样化,MySQL也不得不在功能方面作出大量的努力,以不断满足客户的新需求。比如最新版本中出现的Eent Scheduler(类似于Oracle的Job功能)、Partition功能,自主研发的Maria存储引擎在功能方面的扩展,Falcon存储引擎对事务的支持等,都证明了MySQL在功能方面也开始了不懈的努力。
任何一种产品,都不可能是绝对完美的,也不可能适用于所有用户。我们只有衡量了每一种产品的各种特性之后,从中选择出一种最适合自己的产品。
1.3 MySQL的主要适用场景
据说目前MySQL用户数量已达千万,其中不乏企业级用户。可以说是目前最为流行的开源数据库管理系统软件。任何产品都不可能是万能的,也不可能适用于所有的应用场景,那么MySQL到底在什么场景下适用,什么场景下不适用呢?它适用的场景如下。
1. Web网站系统
Web站点是MySQL最大的客户群,也是MySQL发展史上最为重要的支撑力量,这一点在最开始的MySQL Server简介部分就已经说明过。
MySQL之所以能成为Web站点开发者们最青睐的数据库管理系统,是因为MySQL数据库的安装配置都非常简单,其使用过程中的维护也不像很多大型商业数据库管理系统那么复杂,而且性能出色。还有一个非常重要的原因,就是MySQL是开放源代码的,完全可以免费使用。
2. 日志记录系统
MySQL数据库的插入和查询都非常高效,如果设计得较好,在使用MyISAM存储引擎的时候,两者可以做到互不锁定,具有很高的并发性能。所以,对需要大量插入和查询日志记录的系统,比如处理用户的登录日志、操作日志等,都是非常适合的应用系统。
3. 数据仓库系统
随着现在存储数据量的飞速增长,我们需要的存储空间也越来越大。数据量的不断增长,使数据的统计分析变得越来越低效,也越来越困难,怎么办?这里有几种主要的解决思路,一种是采用昂贵的高性能主机以提高计算性能,用高端存储设备提高I/O性能,这样做效果理想,但是成本非常高;第二种就是将数据复制到多台使用大容量硬盘的廉价PC Server上,以提高整体计算性能和I/O能力,这样实施效果尚可,存储空间虽有一定限制,但成本低廉;第三种,通过将数据水平拆分,使用多台廉价的PC Server和本地磁盘来存放数据,每台机器上面都只有所有数据的一部分,这样便解决了数据量的问题,所有PC Server一起并行计算,也解决了计算能力问题,通过中间代理程序调配各台机器的运算任务,既可以解决计算性能问题又可以解决I/O性能问题,成本也很低廉。在上面的三种方案中,对第二种和第三种方案,MySQL都有较大的优势。通过MySQL的简单复制功能,可以很好地将数据从一台主机复制到另外一台,不仅仅在局域网内,在广域网同样可以复制。当然,很多人可能会说,其他的数据库同样也可以做到,不是只有MySQL有这样的功能。确实,很多数据库同样能做到,但是MySQL是免费的,其他数据库大多是按照主机数量或CPU数量来收费的,当我们使用大量的PC Server的时候,license费用相当惊人。第一种方案,基本上所有数据库系统都能够实现,但是其高昂的成本并不是每一家公司都能够承担的。目前基于比较成熟的数据仓库解决方案主要是MySQL与Infobright相结合的DW系统。
4. 嵌入式系统
嵌入式环境对软件系统最大的限制是硬件资源非常有限,在嵌入式环境下运行的软件系统,必须是轻量级低消耗的软件。
MySQL在资源的使用方面伸缩性非常大,它可以在资源非常充裕的环境下运行,也可以在资源非常少的环境下正常运行。对于嵌入式环境来说,它是一种非常合适的数据库系统,而且MySQL有专门针对嵌入式环境的版本。
1.4 小结
从最初的诞生,到发展成为目前最为流行的开源数据库管理软件,MySQL已经走过了较长的一段路,也正是这段不寻常的路,造就了今天MySQL的成就。
通过本章的信息,读者应该是比较清楚MySQL的大部分基本信息了,对MySQL主要特长,以及适用场景,都有了一个初步的了解。后续章节将会针对这些内容作更为详细深入的介绍。