当前位置: 移动技术网 > IT编程>数据库>Mysql > 来,看看MySQL 5.6, 5.7, 8.0的新特性

来,看看MySQL 5.6, 5.7, 8.0的新特性

2018年10月19日  | 移动技术网IT编程  | 我要评论

对于mysql的历史,相信很多人早已耳熟能详,这里就不要赘述。下面仅从产品特性的角度梳理其发展过程中的里程碑事件。

1995年,mysql 1.0发布,仅供内部使用。

1996年,mysql 3.11.1发布,直接跳过了mysql 2.x版本。

1999年,mysql ab公司成立。同年,发布mysql 3.23,该版本集成了berkeley db存储引擎。该引擎由sleepycat公司开发,支持事务。在集成该引擎的过程中,对源码进行了改造,为后续可插拔式存储引擎架构奠定了基础。

2000年,isam升级为myisam存储引擎。同年,mysql基于gpl协议开放源码。

2002年,mysql 4.0发布,集成了后来大名鼎鼎的innodb存储引擎。该引擎由innobase公司开发,支持事务,支持行级锁,适用于oltp等高并发场景。

2005年,mysql 5.0发布,开始支持游标,存储过程,触发器,视图,xa事务等特性。同年,oracle收购innobase公司。

2008年,sun以10亿美金收购mysql ab。同年,发布mysql 5.1,其开始支持定时器(event scheduler),分区,基于行的复制等特性。

2009年,oracle以74亿美金收购sun公司。

2010年,mysql 5.5发布,其包括如下重要特性及更新。

  • innodb代替myisam成为mysql默认的存储引擎。
  • 多核扩展,能更充分地使用多核cpu。
  • innodb的性能提升,包括支持索引的快速创建,表压缩,i/o子系统的性能提升,purge操作从主线程中剥离出来,buffer pool可拆分为多个instances。
  • 半同步复制。
  • 引入utf8mb4字符集,可用来存储emoji表情。
  • 引入metadata locks(元数据锁)。
  • 分区表的增强,新增两个分区类型:range columns和list columns。
  • mysql企业版引入线程池。
  • 可配置io读写线程的数量(innodb_read_io_threads,innodb_write_io_threads)。在此之前,其数量为1,且不可配置。
  • 引入innodb_io_capacity选项,用于控制脏页刷新的数量。


2013年,mysql 5.6发布,其包括如下重要特性及更新。

  • gtid复制。
  • 无损复制。
  • 延迟复制。
  • 基于库级别的并行复制。
  • mysqlbinlog可远程备份binlog。
  • 对time, datetime和timestamp进行了重构,可支持小数秒。datetime的空间需求也从之前的8个字节减少到5个字节。
  • online ddl。alter操作不再阻塞dml。
  • 可传输表空间(transportable tablespaces)。
  • 统计信息的持久化。避免主从之间或数据库重启后,同一个sql的执行计划有差异。
  • 全文索引。
  • innodb memcached plugin。
  • explain可用来查看delete,insert,replace,update等dml操作的执行计划,在此之前,只支持select操作。
  • 分区表的增强,包括最大可用分区数增加至8192,支持分区和非分区表之间的数据交换,操作时显式指定分区。
  • redo log总大小的限制从之前的4g扩展至512g。
  • undo log可保存在独立表空间中,因其是随机io,更适合放到ssd中。但仍然不支持空间的自动回收。
  • 可dump和load buffer pool的状态,避免数据库重启后需要较长的预热时间。
  • innodb内部的性能提升,包括拆分kernel mutex,引入独立的刷新线程,可设置多个purge线程。
  • 优化器性能提升,引入了icp,mrr,bka等特性,针对子查询进行了优化。

可以说,mysql 5.6是mysql历史上一个里程碑式的版本,这也是目前生产上应用得最广泛的版本。

 

2015年,mysql 5.7发布,其包括如下重要特性及更新。

  • 组复制
  • innodb cluster
  • 多源复制
  • 增强半同步(after_sync)
  • 基于writeset的并行复制。
  • 在线开启gtid复制。
  • 在线设置复制过滤规则。
  • 在线修改buffer pool的大小。
  • 在同一长度编码字节内,修改varchar的大小只需修改表的元数据,无需创建临时表。
  • 可设置numa架构的内存分配策略(innodb_numa_interleave)。
  • 透明页压缩(transparent page compression)。
  • undo表空间的自动回收。
  • 查询优化器的重构和增强。
  • 可查看当前正在执行的sql的执行计划(explain for connection)。
  • 引入了查询改写插件(query rewrite plugin),可在服务端对查询进行改写。
  • explain format=json会显示成本信息,这样可直观的比较两种执行计划的优劣。
  • 引入了虚拟列,类似于oracle中的函数索引。
  • 新实例不再默认创建test数据库及匿名用户。
  • 引入alter user命令,可用来修改用户密码,密码的过期策略,及锁定用户等。
  • mysql.user表中存储密码的字段从password修改为authentication_string。
  • 表空间加密。
  • 优化了performance schema,其内存使用减少。
  • performance schema引入了众多instrumentation。常用的有memory usage instrumentation,可用来查看mysql的内存使用情况,metadata locking instrumentation,可用来查看mdl的持有情况,stage progress instrumentation,可用来查看online ddl的进度。
  • 同一触发事件(insert,delete,update),同一触发时间(before,after),允许创建多个触发器。在此之前,只允许创建一个触发器。
  • innodb原生支持分区表,在此之前,是通过ha_partition接口来实现的。
  • 分区表支持可传输表空间特性。
  • 集成了sys数据库,简化了mysql的管理及异常问题的定位。
  • 原生支持json类型,并引入了众多json函数。
  • 引入了新的逻辑备份工具-mysqlpump,支持表级别的多线程备份。
  • 引入了新的客户端工具-mysqlsh,其支持三种语言:javascript, python and sql。两种api:x devapi,adminapi,其中,前者可将mysql作为文档型数据库进行操作,后者用于管理innodb cluster。
  • mysql_install_db被mysqld --initialize代替,用来进行实例的初始化。
  • 原生支持systemd。
  • 引入了super_read_only选项。
  • 可设置select操作的超时时长(max_execution_time)。
  • 可通过shutdown命令关闭mysql实例。
  • 引入了innodb_deadlock_detect选项,在高并发场景下,可使用该选项来关闭死锁检测。
  • 引入了optimizer hints,可在语句级别控制优化器的行为,如是否开启icp,mrr等,在此之前,只有index hints。
  • gis的增强,包括使用boost.geometry替代之前的gis算法,innodb开始支持空间索引。

 

2018年,mysql 8.0发布,其包括如下重要特性及更新。

  • 引入了原生的,基于innodb的数据字典。数据字典表位于mysql库中,对用户不可见,同mysql库的其它系统表一样,保存在数据目录下的mysql.ibd文件中。不再置于mysql目录下。
  • atomic ddl。
  • 重构了information_schema,其中,部分表已重构为基于数据字典的视图,在此之前,其为临时表。
  • performance_schema查询性能提升,其已内置多个索引。
  • 不可见索引(invisible index)。
  • 降序索引。
  • 直方图。
  • 公用表表达式(common table expressions)。
  • 窗口函数(window functions)。
  • 角色(role)。
  • 资源组(resource groups),可用来控制线程的优先级及其能使用的资源,目前,能被管理的资源只有cpu。
  • 引入了innodb_dedicated_server选项,可基于服务器的内存来动态设置innodb_buffer_pool_size,innodb_log_file_size和innodb_flush_method。
  • 快速加列(algorithm=instant)。
  • json字段的部分更新(json partial updates)。
  • 自增主键的持久化。
  • 可持久化全局变量(set persist)。
  • 默认字符集由latin1修改为utf8mb4。
  • 默认开启undo表空间,且支持在线调整数量(innodb_undo_tablespaces)。在mysql 5.7中,默认不开启,若要开启,只能初始化时设置。
  • 备份锁。
  • redo log的优化,包括允许多个用户线程并发写入log buffer,可动态修改innodb_log_buffer_size的大小。
  • 默认的认证插件由mysql_native_password更改为caching_sha2_password。
  • 默认的内存临时表由memory引擎更改为temptable引擎,相比于前者,后者支持以变长方式存储varchar,varbinary等变长字段。从mysql 8.0.13开始,temptable引擎支持blob字段。
  • grant不再隐式创建用户。
  • select ... for share和select ... for update语句中引入nowait和skip locked选项,解决电商场景热点行问题。
  • 正则表达式的增强,新增了4个相关函数,regexp_instr(),regexp_like(),regexp_replace(),regexp_substr()。
  • 查询优化器在制定执行计划时,会考虑数据是否在buffer pool中。而在此之前,是假设数据都在磁盘中。
  • ha_partition接口从代码层移除,如果要使用分区表,只能使用innodb存储引擎。
  • 引入了更多细粒度的权限来替代super权限,现在授予super权限会提示warning。
  • group by语句不再隐式排序。
  • mysql 5.7引入的表空间加密特性可对redo log和undo log进行加密。
  • information_schema中的innodb_locks和innodb_lock_waits表被移除,取而代之的是performance_schema中的data_locks和data_lock_waits表。
  • 引入performance_schema.variables_info表,记录了参数的来源及修改情况。
  • 增加了对于客户端报错信息的统计(performance_schema.events_errors_summary_xxx)。
  • 可统计查询的响应时间分布(call sys.ps_statement_avg_latency_histogram())。
  • 支持直接修改列名(alter table ... rename column old_name to new_name)。
  • 用户密码可设置重试策略(reuse policy)。
  • 移除password()函数。这就意味着无法通过“set password ... = password('auth_string') ”命令修改用户密码。
  • 代码层移除query cache模块,故query cache相关的变量和操作均不再支持。
  • blob, text, geometry和json字段允许设置默认值。
  • 可通过restart命令重启mysql实例。

 

需要注意的是,上面提到的发布,一般指的是ga版本。

 

最后,看看下面这个表格,表中给出了最近几个大版本的发布时间,及截止到本书出版,其最新的小版本及其发布时间。


                                      https://en.wikipedia.org/wiki/mysql#release_history

从表中的数据来看,

1. 大概每3年会发布一个大的版本。

2. 产品的支持周期一般是8年。

3. 以为mysql 5.5是老古董了,但官方仍然在不断更新。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网