关注“数据和云”获得更多内容

引言

时隔三个月,MySQL 8.0.12 有什么新内容?

今年4月份,MySQL突然直接从8.0.5跳过多个版本号到8.0.11,直接宣布8.0.11 GA,告诉大家说,这个版本已经可以到线上用了。

到今年7月底,MySQL 8.0.12版本发布,我从官方的release note里面,选取出来我认为的重点内容,在这里展开聊一下。

如果有想要看全文的人,可以直接去看官方的发布内容:

https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-12.html


filesort 算法的缓存设置优化

众所周知,MySQL 在处理 Order by 的时候,如果没有索引可以用,会采用一个名为 file sort 的算法排序,但和这个算法有一个关联的参数, sort_buffer_size,估计很多人都知道这个参数,这个参数在之前有个算是比较蛋疼的问题:如果 sql 会话中,执行 sql 需要进行file sort,那么 mysql 就会给当前回话直接分配 sort_buffer_size大小的内存出来。

这个乍一看没啥问题,但需要注意的是,在 MySQL 中,没办法像 Oracle 那样统一管理 PGA(用户线程/进程消耗的总内存大小),遇到那种恰好会话数量比较多,filesort 比较多(哪怕SQL语句单拎出来性能没啥问题),sql 查询量比较大的情况,就非常容易让 MySQL 的内存使用量超标被操作系统 OOM 了。

或者如果你有习惯设置 swap 空间,那么巨慢的 swap 会拖死整个机器,只能挥泪重启,类似这种事故,在互联网业务中,并不鲜见,也间接导致了很多人非常厌恶 file sort,哪怕多加几条索引,也要全覆盖式地处理掉所有 file sort。

但现在,这个内存分配机制总算改变了,从 8.0.12 开始,这个内存分配变成了按需分配。也就是说,对于排序量非常小的 sql(比如某个人的微博列表)这种,触发了file sort,就再也不会直接分配 sort_buffer_size(默认256KB)的大小了,而是分配很小的内存出来用,某种程度上可以避免了很多突发性流量导致的事故。

rewrite插件支持DML语句

MySQL 从 5.7 开始,新增了一个 plugin 的接口,rewrite,用于在服务器接受 SQL 语句后,执行前修改 SQL 语句,最初只是支持 select,从 8.0.12 开始,支持了 insert,update,replace 这些 DML 语句。

SELECT ORDER BY与GROUP BY语法变更

8.0.12,8.0.13(未发布版本,但文档中已经更新内容)开始,MySQL 的 Order by 支持 GROUPING函数 以及 WITH ROLLUP语法,然后,在8.0.13开始,废弃掉group gy 中的desc,asc关键字,对于 WITH ROLLUP 得到的结果集合的排序,需要使用order by 语法。

对于搞数据聚合比较多的人来说,WITH ROLLUP 与 GROUPING 应该不算陌生,这个语法变更,相当于是把 order by 的语法补全完整,更兼容 SQL 标准语法了,如果迁移程序到 8.0,需要注意这种不兼容的变更。

顺带一提,官方文档此处写的是小写的 grouping,但实际上指的是 GROUPING函数 而非普通聚合函数(普通聚合函数一直是支持的)。参考代码:https://github.com/mysql/mysql-server/commit/d401baf535a69d6f2a945229acecbfd5863c0a48

测试表数据

With rollup语法:


8.0.12 之前(测试版本为 5.7.22),如果想要排序,会出现语法错误:

需要写为(排序关键字写到 group by  里面):

8.0.12 开始可以执行并排序(为了显著效果增加了desc 关键字):

Group Replication继续优化

新增了参数 group_replication_exit_state_action 来控制,如果一个实例发现自己属于被抛弃(网络分区发生后的少数派)的实例的情况下,这个值默认为ABORT_SERVER,也就是说,少数派会自己关闭,这个值也可以设置为 READ_ONLY,这个设置下,会以只读(设置super read only)的形式加入集群,并设置状态为 ERROR。

InnoDB Alter Table优化

这个可以说是一个源远流长的故事,简单来说,就是腾讯游戏部门的 DBA 们,为了数据库快速加列(游戏运营先天的快速变更问题),写了补丁出来用(非常早年的时候),后来这个补丁逐渐被各个第三方发行版接受,现在终于进入官方发布版,让更多的人受益。

MySQL 的 DDL一直是非常出名的问题,社区与官方都在这个问题上投入了很大的精力,从最早 percona 的 toolkit 里面带的 pt-osc(这个基于触发器实现的在线改表,由于 MySQL 早年单表只支持一个触发器,为了避免无法使用 pt-osc,有了早年一直流传到现在的 MySQL重大守则之一:不许使用触发器),到 github 发布的 gh-ost(基于 row 格式 binlog),官方也一直在搞 alter 相关的在线修改优化(比如加索引等操作,参考链接 https://dev.mysql.com/doc/refman/8.0/en/innodb-create-index-overview.html)。

alter table 的 inplace 算法,实质上解决的,是主库 DDL 不会导致读写锁表,但对于主从结构,当 SQL 传输到从库执行的时候,从库依然会有相当大的延迟出现。因此实际上,对于延迟敏感性业务,依然是前面提到那俩工具的天下。

8.0.12的优化是,新增了一个算法 ALGORITHM=INSTANT,专门处理只需要修改元数据就可以完成的变更,这个就可以相对比较方便地直接使用了,不需要担心从库延迟。

目前支持的操作是:

  1. 添加新列。已知限制条件如下:

  • 不能与其他不支持INSTANT算法的alter子语句合并在一起。

  • 只能添加在表列的末尾。

  • 不能用于innodb的压缩表(ROW_FORMAT=COMPRESSED)。

  • 目标表不能包含全文索引。

  • 目标表不能是临时表。

  • 目标表不能是数据字典表。

  • 这种添加方式下,不会计算行长度是否合适,这个计算会在发生insert或者update的时候处理。

2. 添加或者删除虚拟列。

   3. 添加或者去掉列的默认值。

   4. 修改 enum,set 列类型的定义(题外话,有多少人知道并在用这个?)

   5. 修改索引类型。

   6. 重命名表名称。


binlog支持管道输入

对于大个头 binlog 的处理,由于 MySQL mysqlbinlog 程序之前是不支持管道的,只能先解压,之后再处理。从 8.0.12 开始,mysqlbinlog支持管道输入了,简单来说,就是下面这么一回事:

gzip -cd binlog-files_1.gz | ./mysqlbinlog - | ./mysql -uroot -p

当一条drop 语句里面包含了关联的父子表,则会直接删除,不在额外要求父子表顺序正确

如题,对于每次删表都需要关闭外键检查的人来说,无疑是个好消息。

MySQL 外键关联删表:

8.0,版本中,普通情况下,删除父表:

报错 3730

在更早的版本(5.7)中:

可以看出错误信息,在 8.0 开始更加详细了。

如果执行 drop table father,child:

必须写成:

但是,在 8.0.12 开始:

ADMIN成为关键字

以后 SQL 字段又少了一个常用的词哎=_=。


是谁关闭了数据库?

MySQL 终于会在日志里面记录,是谁发的 shutdown 命令了。

MySQL 关闭数据库:

那些或许很好玩的bug

下面是从 bugfix 记录中,找的一些好玩被修复的内容,注意——由于每个人笑点不同,如果只关注新特性修改的话,下面的内容不看就不看了。

  1. 早前宣布的新事务模型 VATS,由于其需要追踪所有等待其他事务的事务数量,为了避免死锁,目前被修改为生成出来的近似值。

  2. gtid_purge(记录那些gtid事务已经被purge掉)的值,在Group Replication 运行期间,应该是不能被修改的,然而现在发现它是可以修改的,因此改为在 group replication 运行时候不能修改。

  3. 当 expire_logs_days 与 binlog_expire_logs_seconds 参数都设置的情况下,如果设置了 skip-log-bin ,现在开始这个信息会被写入错误日志。

  4. 当有超大事务执行(binlog 量超过 binlog_cache_size)的时候,在刷出到临时文件期间,如果遇到磁盘满导致的刷出失败,事务回滚,这个信息没有被记录在错误日志里面,并且,事务回滚后,缓存也不会被清空。

  5. SUPER 权限的用户,没办法修改 keyring_operations 参数。

  6. It was possible to drop the Performance Schema. 哈哈哈哈哈。

  7. slave_rows_search_algorithms 指定了 row 格式复制时候,行匹配的的方式,指定为 INDEX_SCAN 的话,如果表上有索引,则会使用索引操作。但如果主从库的同一张表,使用了不同的列作为主键,并且从库表上还有唯一索引的情况下,bug 会导致使用 table scan(全表扫描)而非索引。

  8. 对于 MyISAM 来说,特定的 insert 与 delete 语句顺序,会导致表数据损坏。


原创:刘伟。

投稿:有投稿意向技术人请在公众号对话框留言。

转载:意向文章下方留言。

更多精彩请关注 “数据和云” 公众号 。


招聘专栏

Oracle 售前工程师(广州、深圳、上海、武汉、北京、石家庄)

Oracle 高级工程师(上海、深圳、北京、成都、昆明、贵州、西宁)

MySQL 技术经理(上海、南京、成都)

MySQL 工程师(上海、杭州)

超高待遇:丰厚的年终奖,五险一金,高额学习基金,团建旅游,法定节假日,福利假期等。

推荐他人成功入职有好礼(iPhone X)相送 。

投递简历至邮箱:hr@enmotech.com

资源下载

关注公众号:数据和云(OraNews)回复关键字获取

2018DTCC , 数据库大会PPT

2017DTC,2017 DTC 大会 PPT

DBALIFE ,“DBA 的一天”海报

DBA04 ,DBA 手记4 电子书

122ARCH ,Oracle 12.2体系结构图

2017OOW ,Oracle OpenWorld 资料

PRELECTION ,大讲堂讲师课程资料

近期文章

仅仅使用AWR做报告? 性能优化还未入门

实战课堂:一则CPU 100%的故障分析

杨廷琨:如何编写高效SQL(含PPT)

一份高达555页的技术PPT会是什么样子?

大象起舞:用PostgreSQL解海盗分金问题

ProxySQL!像C罗一样的强大

高手过招:用SQL解决环环相扣刑侦推理问题

MySQL 8.0.12 有什么新内容?相关推荐

  1. mysql8 win10启动_Windows10 mysql 8.0.12 非安装版配置启动方法

    本文为大家分享了mysql 8.0.12非安装版配置启动的具体步骤,供大家参考,具体内容如下 1.官方下载地址 选择: MySQL Community Edition -> MySQL Comm ...

  2. 两千字揭密 MySQL 8.0.19 三大索引新功能:隐藏索引,降序索引,函数索引

    导读:本文详细介绍 MySQL 8.0.19 三大索引新功能,隐藏索引,降序索引,函数索引,结合其他同仁的技术应用案例,进一步进行验证改编,最后总结心得,希望对大家有帮助. MySQL 8.0 版本带 ...

  3. mysql8.0windows,Windows下mysql 8.0.12 安装详细教程

    本文为大家分享了mysql 8.0.12 安装详细教程,供大家参考,具体内容如下 一.安装 1.从官网上下载MySQL8.0.12版本,下载链接 2.下载后解压到一个文件夹下 我的解压路径:C:\Pr ...

  4. groupby索引有效吗_两千字揭密 MySQL 8.0.19 三大索引新功能

    原文链接:https://www.modb.pro/db/22619 导读:本文详细介绍 MySQL 8.0.19 三大索引新功能,隐藏索引,降序索引,函数索引,结合其他同仁的技术应用案例,进一步进行 ...

  5. 如何安装mysql 8.0.12_基于Windows安装MySQL 8.0.12图文教程

    本教程仅适用Windows系统,如果你原本装了没装上,一定要先删除原本的数据库,执行:mysqld --remove mysql,然后在看我的帖子! 第一步:到MySQL官网下载安装包 第二步:将下载 ...

  6. mysql 8.0.12 解压版安装步骤

    mysql 8.0.12 解压版安装步骤 最近看书刚好看到自动化测试框架搭建篇,需要使用python+mysql数据库做个数据驱动测试.电脑上的版本太低,准备安装一个最新的版本,记录下安装的过程. 安 ...

  7. mysql 8.0.12解压版安装教程_mysql 8.0.12 解压版安装教程

    本文为大家分享了mysql 8.0.12 解压版安装教程,供大家参考,具体内容如下 1.首先在官网上下载mysql8.0.12的压缩包:下载地址 2.下载成功后解压到任意目录,比如我的是E:\down ...

  8. SQLyog 报错2058 :连接 mysql 8.0.12 解决方法

    今天闲来无事,下载新版的 mysql 8.0.12 安装. 为了方便安装查看,我下载了sqlyog 工具 连接 mysql 配置新连接报错:错误号码 2058,分析是 mysql 密码加密方法变了. ...

  9. win10 安装mysql 8.0.12

    按照CSDN以及博客园的其他教程, 之前安装过几次都有或多或少的bug 主要安装步骤: 1.配置my.ini文件 2.管理员进入终端, 切换到.../bin目录下进行操作 3.指令操作: 1) mys ...

最新文章

  1. Jupyter notebook的内核是什么?Ipython
  2. 作为我的第一篇csdn博客吧
  3. jQuery课程介绍、Query的介绍、Query初次体验、jQuery再次体验、jQuery中的顶级对象
  4. android项目wehpu,README.md
  5. java获取tomcat路径
  6. 河南省某炮旅的RAID5恢复
  7. 合并K个有序数组(链表)【字节跳动面试算法题】
  8. Sql server锁,独占锁,共享锁,更新锁,乐观锁,悲观锁
  9. Linux目录树与文件系统
  10. nvidia显示设置不可用_白送大福利?实战FreeSync显示器开启NVIDIA G-Sync Compatible
  11. 孔浩java web视频教程_孔浩老师webservice视频教程(含CXF视频教程)
  12. Qt:windows下Qt安装教程
  13. 12.(地图数据篇)cesium城市建筑物贴图
  14. 不精确微分/不完整微分(Inexact differential/Imperfect differential)
  15. 企业自建私有云-openstack-介绍
  16. c++ 显示三维散点图_办公小技巧:三维展示 用好Excel矩阵图
  17. Linux内核“问题门” - 学习问题、经验集锦
  18. [归并排序]leetcode327:区间和的个数(hard)
  19. 计算机毕业设计Java宠物用品交易网站(源码+系统+mysql数据库+lw文档)
  20. 11份大佬的真实简历

热门文章

  1. android开源2016_2016年十大开源项目
  2. 街头霸王背景_街头霸王与摇滚明星:开放式领导的艺术
  3. Bootstrap使用 .dropdown-menu 类创建下拉菜单
  4. Git笔记(5) 状态记录
  5. 视觉SLAM笔记(48) 局部地图
  6. Linux删除证书文件命令,Linux基础面面观之文件复制、移动、删除的命令
  7. string常用函数用法集合
  8. HTML5+CSS+JQuery 实现简单的进度条功能
  9. day21—AngularJS学习初体验
  10. Vue.JS学习笔记