轻量级Java EE企业应用开发实战
上QQ阅读APP看书,第一时间看更新

4.1 MySQL概述

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,后来被Sun公司收购,Sun公司后来又被Oracle公司收购,目前已经归属于Oracle旗下。MySQL是流行的关系型数据库管理系统之一,在Web应用方面,MySQL是很好的关系型数据库管理系统。

MySQL所使用的SQL语言是用于访问数据库的常用标准化语言。MySQL软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发以及互联网企业都选择MySQL作为其数据库。

4.1.1 MySQL名字的由来

MySQL的海豚标志的名字叫Sakila,它是由MySQL AB的创始人从用户在“海豚命名”的竞赛中建议的大量名字表中选出来的。获胜的名字是由来自非洲斯威士兰的开源软件开发者Ambrose Twebaze提供的。根据Ambrose所说,Sakila来自一种叫SiSwati的斯威士兰方言,女性化名称Sakila源自SiSwati。Sakila也是坦桑尼亚Arusha地区的一个镇名,靠近Ambrose的母国乌干达。

MySQL的基本目录以及大量库和工具均采用了前缀“My”,其原因是MySQL的共同创办人Monty Widenius的女儿名字叫“My”。

4.1.2 MySQL的发展历程

1979年,有一个名叫Monty Widenius的人,为一个叫TcX的小公司打工,并用BASIC设计了一个报表工具,可以在4MHz主频和16KB内存的计算机上运行。过了不久,他将此工具使用C语言重写,移植到UNIX平台,当时这只是一个很底层的面向报表的存储引擎。这个工具叫作Unireg。

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

1990年,TcX的客户中开始有人要求为它的API提供SQL支持,当时有人想到了直接使用商用数据库,但是Monty觉得商用数据库的速度难以令人满意。于是,他直接借助mSQL的代码将它集成到自己的存储引擎中。但不巧的是,效果并不太好。于是,Monty决心自己重写一个SQL支持。

1996年,MySQL 1.0发布,在小范围内使用。到了1996年10月,MySQL 3.11.1发布了,没有2.x版本。开始只提供了Solaris下的二进制版本。一个月后,Linux版本出现了。此时的MySQL还非常简陋,除了在一个表上做一些Insert、Update、Delete和Select操作外,没有其他更多的功能。

接下来的两年里,MySQL依次移植到各个平台下。它发布时采用的许可策略有些与众不同:允许免费商用,但是不能将MySQL与自己的产品绑定在一起发布。如果想一起发布,就必须使用特殊许可,意味着需要更多的花费。这种特殊许可为MySQL带来一些收入,从而为它的持续发展打下了良好的基础。

1999至2000年,有一家公司在瑞典成立了,叫MySQL AB。与Sleepycat合作开发出了Berkeley DB引擎。因为Berkeley DB引擎支持事务处理,所以MySQL从此开始支持事务处理了。

2000年4月,MySQL对旧的存储引擎进行了整理,命名为MyISAM。

2001年,Heikiki Tuuri向MySQL提出建议,希望能集成他们的存储引擎InnoDB,这个引擎同样支持事务处理,还支持行级锁。所以在2001年发布3.23版本的时候,该版本已经支持大多数基本的SQL操作,而且还集成了MyISAM和InnoDB存储引擎。MySQL与InnoDB的正式结合版本是4.0。

2004年10月,发布了经典的4.1版本。2005年10月,又发布了里程碑的一个版本,MySQL 5.0。在MySQL 5.0中加入了游标、存储过程、触发器、视图和事务的支持。在5.0之后的版本里,MySQL明确地表现出迈向高性能数据库的发展步伐。

2008年1月16日,MySQL被Sun公司收购。

2009年04月20日,Oracle收购了Sun公司,MySQL转入Oracle旗下。自此,MySQL数据库进入Oracle时代,而其第三方的存储引擎InnoDB早在2005年就被Oracle公司收购。

2010年12月,MySQL 5.5发布,其主要新特性包括半同步的复制及对SIGNAL/RESIGNAL的异常处理功能的支持,重要的是InnoDB存储引擎终于变为当前MySQL的默认存储引擎。MySQL 5.5不是时隔两年后的一次简单的版本更新,而是加强了MySQL各个方面企业级的特性。Oracle公司同时承诺MySQL 5.5和未来版本仍采用GPL授权的开源产品。

2011年4月,MySQL 5.6发布,作为被Oracle收购后第一个正式发布并做了大量变更的版本(5.5版本主要是对社区开发的功能的集成),对复制模式、优化器等做了大量的变更,其中重要的主从GTID复制模式大大降低了MySQL高可用操作的复杂性,除此之外,由于对源代码进行了大量的调整,到2013年,5.6版本才正式发布。

2013年4月,5.6版本发布后,新特性的变更开始作为独立的5.7分支进行进一步开发,在并行控制、并行复制等方面进行了大量的优化调整,正式发布于2015年10月,这个版本也是目前新的稳定版本分支。

2016年9月,Oracle决定跳过MySQL 5.x命名系列,并抛弃之前的MySQL 6、7两个分支(从来没有对外发布的两个分支),直接进入MySQL 8版本命名,也就是MySQL 8.0版本的开发。MySQL 8带来了全新的体验,比如支持NoSQL、JSON等,拥有比MySQL 5.7两倍以上的性能提升。

4.1.3 MySQL的特点

MySQL的特点如下:

1.MySQL是一个数据库管理系统

数据库是数据的结构化集合。从简单的购物清单到图片库,或者企业网络中的大量信息,它可以是任何东西。要添加、访问和处理存储在计算机数据库中的数据,需要一个数据库管理系统,例如MySQL Server。由于计算机非常擅长处理大量数据,因此数据库管理系统作为独立实用的程序或其他应用程序的一部分,在计算中起着核心作用。

2.MySQL数据库是关系型的

关系数据库将数据存储在单独的表中,其数据结构被组织成针对速度进行了优化的物理文件。数据库所具有的逻辑模型(例如数据库、表、视图、行和列)提供了灵活的编程环境。可以设置规则来管理不同数据字段之间的关系,例如一对一、一对多、唯一、必需或可选以及不同表之间的“指针”。当数据库执行这些规则时,可以保证应用程序永远不会看到不一致、重复、孤立、过时或丢失的数据。

MySQL的SQL部分代表结构化查询语言。SQL是用于访问数据库的常见标准化语言。根据不同的编程环境,可以直接输入SQL来生成报告,或者将SQL语句嵌入用另一种语言编写的代码中,或者使用隐藏SQL语法的特定于语言的API。

SQL由ANSI/ISO SQL标准定义。自1986年以来,SQL标准一直在发展,并且存在多个版本,比如SQL-92、SQL:1999等,目前新版本是SQL:2003。MySQL支持新的SQL标准版本。

3.MySQL软件是开源的

开源意味着任何人都可以使用和修改该软件。任何人都可以从互联网上下载MySQL软件并使用它而无须支付任何费用。如果愿意,可以学习源代码并进行更改以适合你的需求。MySQL软件使用GPL(GNU通用公共许可证)来定义在不同情况下可以使用或不可以使用的软件。如果对GPL不满意,或者需要将MySQL代码嵌入商业应用程序中,那么也可以购买商业许可版本。

4.MySQL非常快速、可靠、可扩展且易于使用

MySQL Server可以与其他应用程序、Web服务器等一起轻松地在台式机或笔记本电脑上运行。如果将整台计算机专用于部署MySQL,那么可以更加方便地调整设置MySQL,使得MySQL可以更高效的利用计算机的内存、CPU和I/O容量。MySQL还可以搭建机器集群。

MySQL Server最初是为处理大型数据库而开发的,其处理速度比现有的解决方案要快得多,并且已经在要求严格的生产环境中成功使用了数年。尽管处于不断发展中,但MySQL Server如今提供了一组丰富而有用的功能。它的连接性、速度和安全性使MySQL Server非常适合访问Internet上的数据库。

5.MySQL能在客户端/服务器或嵌入式系统中工作

MySQL数据库软件是一个客户端/服务器系统,由支持不同后端的多线程SQL Server、几个不同的客户端程序和库、管理工具以及各种应用程序编程接口(API)组成。

MySQL Server还可以作为嵌入式多线程库,可以将其链接到应用程序中以获得更小、更快、更易于管理的独立产品。