毫无疑问,目前MySQL已经成为最为流行的开源关系数据库系统,并且一步步地占领了原有商业数据库市场。如今Google、Facebook、Yahoo、网易、九游、淘宝等大公司都在使用MySQL数据库。而MySQL的发展也从1.0到如今的8.0版本,其功能的完善和稳定性也得到了很好的保证。
简单来说,MySQL发展史可分为三个阶段,如下图:
第一阶段:MySQL初期开源阶段
第二阶段:Sun MySQL阶段
第三阶段:Oracle MySQL阶段
MySQL是一个关系型数据库管理系统,由天才程序员Monty开发。在1996年发布了MySQL1.0版本,当时还只是面向一小波人使用。到了同年10月发布了MySQL 3.11.1版本(没有2.x版本)。1999年左右,瑞典MySQL AB公司成立,Monty牵头开发出了BDB引擎,因为BDB支持事务。所以MySQL也开始支持事务处理了,并且提供众多编程语言接口。
下面开始结合MySQL版本发展时间线来阐述MySQL历史:
- Version 1.0(1995)
MySQL 1.0发布,仅供内部使用。
- Version 3.11(1996)
MySQL 3.11.1发布,直接跳过了MySQL 2.x版本。
- Version 3.23(1999)
MySQL AB公司成立。同年,发布MySQL 3.23,一般认为3.23是MySQL真正诞生的时刻,该版本集成了Berkeley DB存储引擎。该引擎由Sleepycat公司开发,支持事务。在集成该引擎的过程中,对源码进行了改造,为后续可插拔式存储引擎架构奠定了基础。
2000年,ISAM升级为MyISAM存储引擎。同年,MySQL基于GPL协议开放源码。并在同年InnoDB创始人向MySQL提议希望支持他的InnoDB存储引擎,这个存储引擎支持行级锁,支持事务,该引擎之后被证明是最为成功的MySQL存储引擎。
- Version 4.0(2003)
MySQL 4.0发布,集成了后来大名鼎鼎的InnoDB存储引擎。该引擎由Innobase公司开发,支持事务,支持行级锁,适用于OLTP等高并发场景。
- Version 4.1(2005)
引入了更多新的语法,并且开始支持UTF-8字符集。
- Version 5.0(2006)
MySQL 5.0发布,开始支持游标,存储过程,触发器,视图,XA事务等特性。同年,Oracle收购Innobase公司。
- Version 5.1(2008)
2008年1月,SUN公司以10亿美元收购MySQL AB公司。在这期间MySQL社区的人都担心Oracle公司会不会不允许MySQL使用Innodb引擎了,因为在2005年Innodb存储引擎被Oracle收购。于是都开发新的引擎,但是没有多久就连MySQL都是Oracle的了,所以也不用在担心Innodb会不会给MySQL使用了。
在Sun公司对其进行了大量的推广,优化,BUG修复。同年并发布了MYSQL 5.1版本,引入了分区、基于行的复制,移除了BDB引擎。
- Version 5.5(2010)
2009年4月,Oracle公司以73亿美元收购Sun公司。自此MySQL数据库进入Oracle时代时代。这个时候MySQL创始人以及社区人都开始担心MySQL的前景,如是否会开源等问题。因为MySQL一直是Oracle数据库的一大对手。并且Oracle公司总裁Larry经常干这种事,买来竞争对手的公司然后砍掉其项目。后来在Oracle发布MySQL5.5版本时也承诺5年内Oracle公司会对MySQL继续大力发展,并且未来版本仍是采用GPL授权。所以现在的MySQL有两个版本企业版和社区本,本质上没有什么区别。
MySQL 5.5也是Oracle收购Sun以后发布的首个版本,主要改善如下:
1. 对Windos系统的更好支持。
2. MySQL 5.5.8默认数据库存储引擎将MyISAM替换为事务存储引擎InnoDB。
3. MySQL 5.5将支持半同步(semi-sync replication MySQL半同步),在MySQL高可用方案上有个更实际可行的办法。
4. 增加了performance_schema库,包含了一些可测量的性能指标的增强,增加了复制、认证和审计API。InnoDB Plugin支持数据压缩存储,节约存储,提高内存命中率。
5. InnoDB Plugin支持adaptive flush checkpoint, 可以在某些场合避免数据库出现突发性瓶颈,Support for Native AIO on Linux。
6. Multi Rollback Segments原来InnoDB只有一个Segment,同时只支持1023的并发。先已扩充到128个Segments,从而解决了高并发的限制。
7. InnoDB的性能提升,包括支持索引的快速创建,表压缩,I/O子系统的性能提升,PURGE操作从主线程中剥离出来,Buffer Pool可拆分为多个Instances。
8. 分区表的增强,新增两个分区类型:RANGE COLUMNS和LIST COLUMNS。
9. 可配置IO读写线程的数量(innodb_read_io_threads, innodb_write_ io_threads)。在此之前,其数量为1,且不可配置。
10. 引入Metadata Locking (MDL) Framework替换了原来的LOCK_open mutex (lock),使得MySQL 5.5在4核以上的服务器中性能得到提升。
11. 引入innodb_io_capacity选项,用于控制脏页刷新的数量。
- Version 5.6(2012)
2012-09-29,MySQL 5.6第一个RC版本发布(MySQL 5.6.7)。随后,2013-02-05,MySQL 5.6第一个GA版本发布(MySQL 5.6.10)。总的来说,MySQL 5.6算是一个里程碑式的版本,包含了大量的新特性,了解这些新特性,不仅对数据库内核研发有帮助,对于更好的使用MySQL数据库也有着极大的意义。
1. 支持GTID复制、延迟复制、基于库级别的并行复制。
2. EXPLAIN可用来查看DELETE、INSERT、REPLACE、UPDATE等DML操作的执行计划,在此之前,只支持SELECT操作。
3. mysqlbinlog工具可远程备份binlog。
4. 对TIME、DATETIME和TIMESTAMP进行了重构,可支持小数秒。DATETIME的空间需求也从之前的8个字节减少到5个字节。
5. 支持Online DDL,某些ALTER操作不再阻塞DDL,比如添加字段和索引。
6. 支持传输表空间(transportable tablespaces)。
7. 支持统计信息持久化,避免主从之间或数据库重启后,同一个SQL的执行计划有差异。
8. 分区表的增强,包括最大可用分区数增加至8192,支持分区和非分区表之间的数据交换,且速度极快。
9. Redo Log总大小的限制从之前的4G扩展至512G。
10. Undo Log可保存在独立表空间中,因其实随机IO,更适合放到SSD中。但仍然不支持空间自动回收,以最大值为标准。
11. 可dump和load缓冲池状态,避免数据库重启后需要较长的预热时间。
12. InnoDB内部的性能提升,包括拆分kernel mutex,引入独立的刷新线程,可设置多个purge线程,修复group commit等。
13. 优化器性能提升,引入了ICP、MRR,BKA等特性,针对子查询进行了优化。
- Version 5.7(2015)
写这篇文章的时候,MySQL 5.7.19 GA版本以已经出来了(2017.11.21),也就是说从现在开始 5.7 已经可以在生产环境中使用,有任何问题官方都将立刻修复。MySQL 5.7的问世又是带来一大堆新特性,下面挑几个重点的简要说明一下;后面会专门针对MySQL 5.7新特性一一阐述。
1. 组复制(InnoDB Cluster),一个划时代的功能,MySQL 5.7.17版本增加。
2. 多源复制,无损复制(AFTER_SYNC),在线开启GTID复制,在线设置复制过滤等。
3. 基于组提交的多线程复制及基于WRITESET的并行复制。
4. 在线修改buffer pool大小。
5. 在同一长度编码字节内,修改VARCHAR的大小只需修改表的元数据,无需创建临时表。
6. 透明页压缩(transparent page compression),之前只支持页压缩。
7. Undo表空间的自动回收。
8. 引入ALTER USER命令,可用来修改用户密码,密码的过期策略,及锁定用户等。
9. 原生支持JSON类型,并引入了众多JSON函数。
10. 引入了super_read_only选项,相比之前的read_only选项就是可以禁止super权限用户写入。
11. 引入了新的逻辑备份工具-mysqlpump,支持表级别的多线程备份。
12. 引入了新的客户端工具-mysqlsh,其支持三种语言:JavaScript, Python and SQL。两种API:X DevAPI,AdminAPI,其中,前者可将MySQL作为文档型数据库进行操作,后者用于管理InnoDB Cluster。
13. mysql_install_db被mysqld –initialize代替,用来进行实例的初始化。且安装MySQL后root产生了随机密码等等。
14. 引入了innodb_deadlock_detect选项,在高并发场景下,可使用该选项来关闭死锁检测。
15. 集成了SYS数据库,简化了MySQL的管理及异常问题的定位。
16. 可设置SELECT操作的超时时长(max_execution_time)。
17. 优化了Performance Schema,其内存使用减少。Performance Schema引入了众多instrumentation。常用的有Memory usage instrumentation,可用来查看MySQL的内存使用情况,Metadata Locking Instrumentation,可用来查看MDL的持有情况,Stage Progress instrumentation,可用来查看Online DDL的进度。
18. 新实例不再默认创建test数据库及匿名用户。
19. mysql.user表中存储密码的字段从password修改为authentication_string。
20. 引入了Optimizer Hints,可在语句级别控制优化器的行为,如是否开启ICP,MRR等,在此之前,只有Index Hints。
21. GIS的增强,包括使用Boost.Geometry替代之前的GIS算法,InnoDB开始支持空间索引。
22. 引入了查询改写插件(Query Rewrite Plugin),可在服务端对查询进行改写。
23. 表空间加密,引入了虚拟列。
24. 独立临时表空间。
25. 可通过SHUTDOWN命令关闭MySQL实例。
26. EXPLAIN FORMAT=JSON会显示成本信息,这样可直观的比较两种执行计划的优劣。
- Version 8.0(2017)
2016年9月,Oracle决定跳过MySQL 5.x命名系列,并抛弃之前的MySQL 6,7两个分支(从来没有对外发布的两个分支,但存在过),直接进入MySQL 8.0版本时代。2017年12月10号,MySQL 8.0 GA。带来了如下诸多特性。
1. 引入了原生的,基于InnoDB的数据字典。数据字典表位于mysql库中,对用户不可见,同mysql库的其它系统表一样,保存在数据目录下的mysql.ibd文件中。不再置于mysql目录下。
2. Atomic DDL。
3. 重构了INFORMATION_SCHEMA,其中,部分表已重构为基于数据字典的视图,在此之前,其为临时表。
4. PERFORMANCE_SCHEMA查询性能提升,其已内置多个索引。
5. 支持不可见索引(Invisible index)。
6. 支持降序索引。
7. 支持直方图。
8. 支持公用表表达式(Common table expressio ns)。
9. 支持窗口函数(Window functions)。
10. 支持用户角色(Role)。
11. 引入资源组(Resource Groups),可用来控制线程的优先级及其能使用的资源,目前,能被管理的资源只有CPU。
12. 引入了innodb_dedicated_server选项,可基于服务器的内存来动态设置innodb_buffer_pool_size, innodb_log_file_ size和innodb_flush_method。
13. 支持秒级快速加列(ALGORITHM=INSTANT)。
14. JSON字段的部分更新(JSON Partial Updates)。
15. 自增主键的持久化,修复了10之久的Bug。
16. 支持可持久化全局变量(SET PERSIST)。
17. 默认字符集由latin1修改为utf8mb4。
18. 默认开启UNDO表空间,且支持在线调整数量(innodb_undo_tablespaces)。在MySQL 5.7中,默认不开启,若要开启,只能初始化时设置。
19. 支持备份锁。
20. Redo Log的优化,包括允许多个用户线程并发写入log buffer,可动态修改innodb_log_buffer_size的大小。
21. 默认的认证插件由mysql_native_password更改为caching_sha2_password。
22. 默认的内存临时表由MEMORY引擎更改为TempTable引擎,相比于前者,后者支持以变长方式存储VARCHAR,VARBINARY等变长字段。从MySQL 8.0.13开始,TempTable引擎支持BLOB字段。
23. Grant命令不再隐式创建用户。
24. SELECT … FOR SHARE和SELECT … FOR UPDATE语句中引入NOWAIT和SKIP LOCKED选项,解决电商场景热点行问题。
25. 正则表达式的增强,新增了4个相关函数,REGEXP_INSTR(), REGEXP_LIKE(), REGEX P_REPLACE(), REGEXP_SUBSTR()。
26. 查询优化器在制定执行计划时,会考虑数据是否在Buffer Pool中。而在此之前,是假设数据都在磁盘中。
27. ha_partition接口从代码层移除,如果要使用分区表,只能使用InnoDB存储引擎。
28. 引入了更多细粒度的权限来替代SUPER权限,现在授予SUPER权限会提示warning。
29. GROUP BY语句不再隐式排序。
30. MySQL 5.7引入的表空间加密特性可对Redo Log和Undo Log进行加密。
31. information_schema中的innodb_locks和innodb_lock_waits表被移除,取而代之的是performance_schema中的data_locks和data_lock_waits表。
32. 引入performance_schema.variables_info表, 记录了参数的来源及修改情况。
33. 增加了对于客户端报错信息的统计(performance_schema.events_errors_summary_xxx)。
34. 可统计查询的响应时间分布(call sys.ps_statement_avg_latency_histogram())。
35. 支持直接修改列名(ALTER TABLE … RENAME COLUMN old_name TO new_na me)。
36. 用户密码可设置重试策略(Reuse Policy)。
37. 移除PASSWORD()函数。这就意味着无法通过“SET PASSWORD … = PASSWORD(‘a uth_string’) ”命令修改用户密码。
38. 代码层移除Query Cache模块,故Query Cache相关的变量和操作均不再支持。
39. BLOB, TEXT, GEOMETRY和JSON字段允许设置默认值。
40. 可通过RESTART命令重启MySQL实例。
<Release history>
https://en.wikipedia.org/wiki/MySQL#Release_history