MySQL 8.0 来了,看看有哪些真香特性

MySQL 被 Sun 收购后,搞了个过渡的 6.0 版本,没多久就下线了 (有一次居然听说有人在线上用 6.0 版本,我惊得下巴都掉了)。被 Oracle 收购后,终于迎来了像样的 5.6 版本,之后就是 5.7、8.0 版本。这么看来,Sun 的衰亡不无道理。

P.S,上面说了 6.0 版本号已被用过,7.x 系列版本专用于 NDB Cluster,因而新版本号从 8.0 开始。

刚被 Oracle 收购时,大家恐慌的不行,貌似还甚至搞了个联合签名请愿活动来着,可惜真的是应了那句话“天下大势, 浩浩汤汤, 顺之者昌, 逆之者亡”。

创始人 Monty 又折腾了 MariaDB,可惜也是不温不火的。MySQL 8.0 发布后,MariaDB 宣布不打算继续合并 InnoDB 引擎,这下就更尴尬了,以后还能愉快的玩耍了吗? 这两年 Monty 老先生还时不时来中国露个脸,但似乎有那么一丢丢变味了。

闲话少说,一起来看看 8.0 都有哪些真香特性吧。

1. 为什么是 8.0

作为迄今为止,地表最强的 MySQL 版本,8.0 被寄予厚望。

虽然在很多人眼里,MySQL 8.0 无非是有个 "好爹",很多新特性是照着 Oracle"抄" 的。但在我看来,Oracle 作为先驱前辈,已经证明了这些技术的优秀之处,有什么理由不借鉴呢,难道非要折腾出一些只为了能自嗨的莫名其妙的特性才叫牛逼,比如只能用触发器变相实现的表分区功能的某 DB?

再说了,即便有个”好爹“,就一定能做好吗,国民老公不也被限制消费了?

MySQL 8.0 无论在功能还是性能 (整体上),都是目前最好的 MySQL 版本。以往因为某些特性不支持,导致需要在业务代码、逻辑上做一些妥协,甚至增加使用第三方解决方案 (例如 NOSQL)。

我相信从 8.0 开始,以后这种情况会越来越少的,MySQL 会越来越好,绝大多数和数据库相关的业务需求,都能在 MySQL 中完成。当然了,我也相信它不会为了哗众取宠,堆砌一些无谓的功能,变成另一个“最好用”的数据库。

2. MySQL 8.0 哪里香

截止本文发稿,MySQL 最新版本是 8.0.19。下面是站在我个人角度上,认为最香的几个特性。

2.1 性能优化相关

无疑是 hash join。相信 DBA 们被弱鸡开发坑怕了,有了 hash join 再也不那么怕没索引的多表 join 了。还有一个,anti join。hash join 刚出来时,我做了个简单的测试,当时也发了过朋友圈:

  1. 快速加新列。做过游戏 DBA 的我简直热泪盈眶,想想以前早起做变更的苦逼岁月 (╥╯^╰╥)
  2. 直方图。没有索引,不想建索引,索引不准确? 不怕,还有直方图兜底。
  3. 函数索引、表达式索引,开发者们该爱死这两个功能了吧。
  4. 消除了全局的 buffer pool mutex。话说这个特性 Percona 好像在 5.5 版本就有了,官方团队在这块的动作慢的有点厉害啊。
  5. 倒序索引。任你正序排,倒序排,还是混合顺序排,啥姿势都能满足,em…
  6. 不可见索引。删个索引,想删又不太敢动手,怎么破? 不可见索引来救命。改为不可见后,观察一阵子,确认没影响了再放心删除吧。
  7. 引入 WRITESET 模式,大大提高并行复制效率,主从复制延迟进一步缩小。
  8. 针对 JSON 数据类型,增加 Multi-valued indexes,更方便 JSON 的搜索了。
  9. HINT 语法增强,更方便在执行查询时动态设定选项,针对不同 SQL 采用不同策略。
  10. 有个新的 TempTable 引擎,比原来的 tmptable 强不少。
  11. 其他优化。

2.2 管理、复制、安全方面的功能提升

  1. 正式推出 Group Relication。很好,在稳步朝着高性能、高可用方向推进,先实现读可扩展,再实现写可扩展。期待不远的将来再实现分布式 Sharding,到那时候,现在市面上那些吹得不可一世的 NEWSQL 们该哑火了,这两年有点憋屈的说。
  2. Clone Plugin 以及 ReplicaSet 特性,配合 MySQL Shell,想要部署一个新的 slave 实例,或者是 InnoDB Cluster 节点,就方便很多了。
  3. sqlrequireprimary_key 选项设定强制要求每个表都得有个主键。在主从环境中,相信太多人吃过没主键的亏了。当然了,我并没有,嘿。
  4. 实例重启后的自增 ID 持久化,小增强却解决了业务上的逻辑大麻烦。
  5. extra admin port,管理员可以给自己开后门了。
  6. 在线修改完配置参数后,SET PERSIST 语法实现持久化,不用再手工修改一次 my.cnf 了。
  7. 锁增强,增加 SKIP LOCK、NOWAIT LOCK 锁模式,以及 BACKUP LOCk。
  8. 窗口函数、CTE。做统计分析同学的福音。
  9. 其他提升。

更多的特性,可以访问下面几个资料查看。

  • MySQL 8.0 新特性
  • MySQL 8.0 相对于 5.7 的复制改进
  • 从 MySQL5.5 到 MySQL8.0 子查询进化之路

3. 看完了还不想上车?

细心的读者,或许能发现在官方文档第一章 "Chapter 1 General Information" 里头,有这么一段话:

  • Support for setting user variables in statements other than
  • SET was deprecated in MySQL 8.0.13. This functionality is
  • subject to removal in MySQL 9.0.

嗯,你没看错,是的,下一个就是 9.0 版本,按照经验,2020 年也应该要发布了。

再吼一下,MySQL 8.0 来了,高铁般的速度,再不上车您就直接用 9.0 吧。