经常听到什么MySQL5.5-5.7、8.0,但是中间的就没咋听说过,今天来探究下这个版本到底是啥情况。
版号说明
以5.5.60这个版本的MySQL为例,说明版本号的每个数字含义(mysql-5.5.60.tar.gz)
- 第一个数字(5)主版本号:文件格式改动时,将作为新的版本发布
- 第二个数字(5)发行版本号:新增特性或者改动不兼容时,发行版本号需要更改
- 第三个数字(60)发行序列号:主要是小的改动,如bug的修复、函数添加或更改、配置参数的更改等
MySQL产品线
3.X至5.1.X
这是早期MySQL的版本。常见早期的版本有:4.1.7、5.0.56等。
5.4.X到5.7.X
这是为了整合MySQL AB公司社区和第三方公司开发的新存储引擎。吸收新的实现算法,更好的支持SMP架构。为提升性能做了大量代码重构。
MySQL 在2017年发布了新的版本8.0,但是在此之前的上一个版本是5.7
早在2008年,Sun收购MySQL AB以前,公司内部已经在进行着版本号6的开发工作了(5.0在2005年发布)。然而,版本6的MySQL制定的目标和计划过于激进,步子迈得有点儿大,随着收购的顺利完成,项目也被砍掉了。 至于版本号7,则是用在了MySQL Cluster上。由于新版的MySQL带来了许多的重大更新,开发者们决定是时候把版本号往前滚动一下了,于是便有了8。
同时因为7发布时间较晚,发布时已经有其他手段解决MySQL集群技术问题,所以并没有很好的推广使用。
大版本间的区别
5.5
innodb
就是从 5.5 这个版本开始成为 默认的存储引擎- 引入了真
UTF8
——>utf8mb4
5.5
的时候引入了MDL(meta data lock)
元数据锁
MySQL
在5.5.3
之后增加了这个utf8mb4
的编码,mb4
就是most bytes 4
的意思,专门用来兼容四字节的unicode
。好在utf8mb4
是utf8
的超集,除了将编码改为utf8mb4
外不需要做其他转换。当然,一般情况下使用utf8
也就够了。
5.6
也可以参考MySQL大版本间的区别,不再赘述了
挑几个说一下:
Innodb
将flush
刷盘操作从主线程移动到其他线程Innodb
可以创建 全文索引- 可以用
EXPLAIN
来查看DELETE
,INSERT
,REPLACE
,UPDATE
等DML
操作的执行计划。在这之前,它只支持SELECT
操作
5.7
同样只挑几个说一下
- 从
MySQL 5.7.8
开始,MySQL
支持原生JSON
类型 - 之前:对于触发器事件(INSERT、UPDATE、DELETE)和操作时间(BEFORE、AFTER)的组合,一个表最多只能有一个触发器,即在某个触发时间点只能有一个触发事件
现在:允许在某个时间点,有多个触发事件 - 由于文件系统
The Fusion-io Non-Volatile Memory (NVM)
在Linux
上提供了原子操作,这导致innodb
的doublewrite
变得冗余,所以在该文件系统上,会自动关闭doublewrite
- 支持多线程来刷新缓冲池中的脏页面
8.0
MySQL 8.0
是有中文文档的:MySQL 8.0 中的新功能
挑几个重点的:
- 索引支持降序排序
- 支持正则表达式
- 可以为这些类型增加默认值
BLOB
、TEXT
、GEOMETRY
、JSON
- 从
MySQL 8.0.20
开始,doublewrite
缓冲区存储在doublewrite
文件中 - 不再支持 查询缓存
MySQL8.0为啥删除查询缓存?
缓存的意义在于快速查询提升系统性能,可以灵活控制缓存的一致性
MySQL
缓存的限制
MySQL
基本没有手段灵活的管理缓存失效和生效,尤其对于频繁更新的表SQL
必须完全一致才会导致cache
命中- 为了节省内存空间,太大的
result set
不会被cache
(小于query\_cache\_limit
) MySQL
缓存在分库分表环境下是不起作用的- 执行
SQL
里有触发器、自定义函数时,MySQL
缓存也是不起作用的 - 在表的结构或数据发生改变时,基于该表相关
cache
立即全部失效
替代方案:应用层组织缓存,最简单的是使用redis
,ehcached
等