MySQL

MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

作为最为流行的开源数据库软件之一,MySQL 数据库软件已经是广为人知了。但是为了照顾对MySQL还不熟悉的读者,这章我们将对 MySQL 做一个简单的介绍。主要内容包括 MySQL 各功能模块组成,各模块协同工作原理,Query 处理的流程等。

1.1 MySQL Server 简介

1.1.1 什么是 MySQL

MySQL 是由MySQL AB公司(目前已经被SUN公司收归麾下)自主研发的,目前IT行业最流行的开放源代码的数据库管理系统之一,它同时也是一个支持多线程高并发多用户的关系型数据库管理系统。

MySQL 数据库以其简单高效可靠的特点,在最近短短几年的时间就从一个名不见经传的数据库系统,变成一个在IT行业几乎是无人不知的开源数据库管理系统。从微型的嵌入式系统,到小型的web网站,至大型的企业级应用,到处都可见其身影的存在。为何一个开源的数据库管理系统会变得如此的流行呢?在我2003年第一次接触MySQL之前,也是非常的纳闷?或许在我大概的向您介绍一下其发展历程之后,心中的这个问题就会消失了。

1.1.2 艰难诞生

1985年,瑞典的几位志同道合小伙子(以David Axmark为首) 成立了一家公司,这就是MySQL AB的前身。这个公司最初并不是为了开发数据库产品,而是在实现他们想法的过程中,需要一个数据库。他们希望能够使用开源的产品。但在当时并没有一个合适的选择,没办法,那就自己开发吧。

在最初,他们只是自己设计了一个利用索引顺序存取数据的方法,也就是ISAM(Indexed Sequential Access Method)存储引擎核心算法的前身,利用ISAM结合mSQL来实现他们的应用需求。在早期,他们主要是为瑞典的一些大型零售商提供数据仓库服务。在系统使用过程中,随着数据量越来越大,系统复杂度越来越高,ISAM和mSQL的组合逐渐不堪重负。在分析性能瓶颈之后,他们发现问题出在mSQL上面。不得已,他们抛弃了mSQL,重新开发了一套功能类似的数据存储引擎,这就是ISAM 存储引擎。大家可能已经注意到他们当时的主要客户是数据仓库,应该也容易理解为什么直至现在,MySQL 最擅长的是查询性能,而不是事务处理(需要借助第三方存储引擎)。

软件诞生,自然该给她取一个好听并且容易记住的名字。时至今日,MySQL AB仍然没有公布当初为什么给这个数据库系统取名为MySQL。据传MySQL是取自创始人之一Monty Widenius的女儿的名字或许大家会认为这仅仅是我的猜测,不以为然,其实也并不是完全没有根据的。大家或许知道MySQL最近正在研发的用来替代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的发展路程我想就不需要我继续再次罗嗦了,因为基本上都可以从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标准所定义的四个事务隔离级别的全部,只是在实现的过程中每一种的实现方式可能有一定的区别,这在当前商用数据库管理系统中都不多见。比如,大家所熟知的大名鼎鼎的Oracle数据库就仅仅实现了其中的两种(Serializable和Read Commited),而PostGreSQL,同样支持四种隔离级别。

不过在可编程支持方面,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成长。

从安装方面来说,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.3.1 Web网站系统

Web站点,是MySQL最大的客户群,也是MySQL发展史上最为重要的支撑力量,这一点在最开始的MySQL Server简介部分就已经说明过。

MySQL之所以能成为Web站点开发者们最青睐的数据库管理系统,是因为MySQL数据库的安装配置都非常简单,使用过程中的维护也不像很多大型商业数据库管理系统那么复杂,而且性能出色。还有一个非常重要的原因就是MySQL是开放源代码的,完全可以免费使用。

1.3.2 日志记录系统

MySQL数据库的插入和查询性能都非常的高效,如果设计地较好,在使用MyISAM存储引擎的时候,两者可以做到互不锁定,达到很高的并发性能。所以,对需要大量的插入和查询日志记录的系统来说,MySQL是非常不错的选择。比如处理用户的登录日志,操作日志等,都是非常适合的应用场景。

1.3.3 数据仓库系统

随着现在数据仓库数据量的飞速增长,我们需要的存储空间越来越大。数据量的不断增长,使数据的统计分析变得越来越低效,也越来越困难。怎么办?这里有几个主要的解决思路,一个是采用昂贵的高性能主机以提高计算性能,用高端存储设备提高I/O性能,效果理想,但是成本非常高;第二个就是通过将数据复制到多台使用大容量硬盘的廉价pc server上,以提高整体计算性能和I/O能力,效果尚可,存储空间有一定限制,成本低廉;第三个,通过将数据水平拆分,使用多台廉价的pc server和本地磁盘来存放数据,每台机器上面都只有所有数据的一部分,解决了数据量的问题,所有pc server一起并行计算,也解决了计算能力问题,通过中间代理程序调配各台机器的运算任务,既可以解决计算性能问题又可以解决I/O性能问题,成本也很低廉。在上面的三个方案中,第二和第三个的实现,MySQL都有较大的优势。通过MySQL的简单复制功能,可以很好的将数据从一台主机复制到另外一台,不仅仅在局域网内可以复制,在广域网同样可以。当然,很多人可能会说,其他的数据库同样也可以做到,不是只有 MySQL有这样的功能。确实,很多数据库同样能做到,但是MySQL是免费的,其他数据库大多都是按照主机数量或者cpu数量来收费,当我们使用大量的pc server的时候,license费用相当惊人。第一个方案,基本上所有数据库系统都能够实现,但是其高昂的成本并不是每一个公司都能够承担的。

1.3.4 嵌入式系统

嵌入式环境对软件系统最大的限制是硬件资源非常有限,在嵌入式环境下运行的软件系统,必须是轻量级低消耗的软件。

MySQL在资源的使用方面的伸缩性非常大,可以在资源非常充裕的环境下运行,也可以在资源非常少的环境下正常运行。它对于嵌入式环境来说,是一种非常合适的数据库系统,而且MySQL有专门针对于嵌入式环境的版本。