测试效率提升36% ~ 100%,相当可观

本文目录

  • 并行构建索引测试

  • 进一步提高索引构建效率

  • 并行构建索引的限制

MySQL 8.0.31于2022.10.11发布了,比我预计的日期早了一周,先赞一个。

看了下 release notes ,新增的东西不算多,感觉MySQL官方对8.0版本已经进入维稳的后半段了,英文不好的同学可以戳此查看 徐轶韬老师针对8.0.31做的快速解读。另外,根据 徐老师的最新推文,也了解到MySQL针对8.0版本延长了标准支持(Premier Support)时长,从原来的2023.4延长到了2025.4,不过延伸支持(Extended Support)的期限没有改变,仍然是2026.4。

本次发布的8.0.31新特性中,我注意到有一句不太起眼的说明:

InnoDB: InnoDB now supports parallel index builds, which improves index build performance. In particular, loading sorted index entries into a B-tree is now multithreaded. Previously, this action was performed by a single thread.

只有这么简单的一句,没更多扩展解释说明。简言之,就是支持并行构建索引,提升索引构建性能。

并行构建索引测试

还是直接做个测试看看吧。

利用sysbench构建一个有400万行记录的测试表,只有一个主键索引时,表空间物理文件大小为1044381696 Bytes,添加完测试索引后,表空间物理文件大小涨到1434451968 Bytes,增加了37.35%。

mysql> CREATE TABLE `t1` (`id` int NOT NULL AUTO_INCREMENT,`k` int NOT NULL DEFAULT '0',`c` char(120) NOT NULL DEFAULT '',`pad` char(60) NOT NULL DEFAULT '',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;mysql> select count(*) from t1;
+----------+
| count(*) |
+----------+
|  4000000 |
+----------+
1 row in set (0.35 sec)

接下来,我分别针对GreatSQL 8.0.25-16、MySQL 8.0.31做重建索引的测试,每个数据库跑10次,计算其每次耗时,去掉最大最小偏差值,取剩下的8次求平均值。都先采用默认设置,最后得到的结果如下表:

GreatSQL 8.0.25-16 MySQL 8.0.31
平均耗时(秒) 42.529 31.202

可以看到,使用MySQL 8.0.31重建索引的效率提升了约36%,还是相当可观的,如果是线上环境有大表可能提升效果更可观。

进一步提高索引构建效率

从MySQL 8.0.27开始,新增选项 innodb_ddl_buffer_size,其作用是作为Online DDL期间的buffer(代替 innodb_sort_buffer_size 的作用),用于提升辅助索引构建的效率。这是Online DDL期间总共可以使用的buffer,如果有多个DDL并发线程,则每个线程最大可用的buffer是 innodb_ddl_buffer_size / innodb_ddl_threads。其默认值是1MB,明显太低了,我在本案中尝试修改成64M、128MB、256MB、512MB、1GB,再对比测试其效果。

选项 innodb_ddl_threads 也是从8.0.27开始新增的,用于定义Online DDL的并发线程数,默认值是4,可根据实际情况调整。

模式 平均耗时(秒) 提升比例
GreatSQL 8.0.25-16默认值 42.529
MySQL 8.0.31默认值 31.202 36.30%
64M 23.448 81.38%
64M + 8thds 21.202 100.59%
128M 22.856 86.07%
128M + 8thds 21.456 98.21%
256M 22.047 92.90%
256M + 8thds 21.266 99.99%
512M 22.885 85.84%
512M + 8thds 23.227 83.10%
1G 25.239 68.51%
1G + 8thds 24.486 73.69%

上面表格中,64M表示innodb_ddl_buffer_size=64M,8thds表示innodb_ddl_threads=8,其他以此类推。

可以看到,当 innodb_ddl_buffer_sizeinnodb_ddl_threads 值适当加大后,重建索引的耗时明显降低,最好的情况下,索引重建效率可提升1倍;不过其效率也并不随着值增加而线性提高。看起来,线上生产环境需要根据实测情况进行调整。

循环自动测试的shell脚本也顺便分享出来:

#!/bin/bash
db=MySQL
# 设置不同的ddl buffer size
for dbp in 64 128 256 512 1024
do
exec 3>&1 4>&2 1>> parallel-index-build-${dbp}m.log 2>&1# 循环10次
for i in $(seq 1 10)
doecho "$db cycle $i"mysql -N -s -q -f -S./$db/mysql.sock -e "set global innodb_ddl_buffer_size=$dbp*1024*1024" test > /dev/null 2>&1mysql -f -S./$db/mysql.sock -e "select @@global.innodb_ddl_buffer_size" testmysql -N -s -q -f -S./$db/mysql.sock -e "alter table t1 drop index i1, drop index i2;" test > /dev/null 2>&1sleep 5time mysql -N -s -q -f -S./$db/mysql.sock -e "alter table t1 add index i1(k), add index i2(pad);" testecho ""echo ""sleep 5
done# 调整ddl threads = 8
exec 3>&1 4>&2 1>> parallel-index-build-${dbp}m-8th.log 2>&1
for i in $(seq 1 10)
doecho "$db cycle $i"mysql -N -s -q -f -S./$db/mysql.sock -e "set global innodb_ddl_threads=8" test > /dev/null 2>&1mysql -f -S./$db/mysql.sock -e "select @@global.innodb_ddl_threads" testmysql -N -s -q -f -S./$db/mysql.sock -e "alter table t1 drop index i1, drop index i2;" test > /dev/null 2>&1sleep 5time mysql -N -s -q -f -S./$db/mysql.sock -e "alter table t1 add index i1(k), add index i2(pad);" testecho ""echo ""sleep 5
done# 恢复 ddl threads=4mysql -N -s -q -f -S./$db/mysql.sock -e "set global innodb_ddl_threads=4" test > /dev/null 2>&1mysql -f -S./$db/mysql.sock -e "select @@global.innodb_ddl_threads" test
done

并行构建索引的限制

最后,再来看下并行构建索引新特性都有哪些限制:

  1. 不支持虚拟列(virtual columns)。

  2. 不支持全文索引(full-text index)。

  3. 不支持空间索引(spatial index )。

期待MySQL 8.0未来新版本中继续推出更多实用的新特性吧。

延伸阅读

  • Changes in MySQL 8.0.31, https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-31.html

  • Configuring Parallel Threads for Online DDL Operations, https://dev.mysql.com/doc/refman/8.0/en/online-ddl-parallel-thread-configuration.html

  • Online DDL Memory Management, https://dev.mysql.com/doc/refman/8.0/en/online-ddl-memory-management.html

Enjoy MySQL :)


《深入浅出MGR》视频课程

戳此小程序即可直达B站

https://www.bilibili.com/medialist/play/1363850082?business=space_collection&business_id=343928&desc=0



文章推荐:

  • MySQL内存为什么不断增高,怎么让它释放

  • 分布式系统中的时钟与一致性解读

  • MySQL进程内存一直在涨,怎么办?

  • events scheduler导致MGR节点退出详解及修复

  • 无损半同步复制下,主从切换后数据一致吗?

  • RC隔离级别下,死锁案例分析

  • 浅析MySQL死锁检测

  • 如何阅读MySQL死锁日志

  • MySQL内存管理机制浅析


想看更多技术好文,点个“在看”吧!

MySQL 8.0.31并行构建索引特性管窥相关推荐

  1. MySQL 8.0.31 集合操作INTERSECT和EXCEPT

    对于聚合的功能MySQL是都是默默的发展.在最新的8.0.31版本中提供对集合操作INTERSECT和EXCEPT.这样一来,集合操作功能基本圆满了.MySQL5.7.40版本是不支持这个集合的. I ...

  2. MySQL 8.0.31 新增支持SQL标准中的交集(INTERSECT)和差集(EXCEPT)表操作符

    文章目录 概览 准备工作 交集( INTERSECT ) 差集( EXCEPT) 旧版本中交集.差集操作是如何实现的 总结 概览 最近的 MySQL 版本( 8.0.31 ) 中,新增了对 SQL 标 ...

  3. MySQL 8.0.31 最新版详细安装教程(下载+安装+配置+登录测试)

    名人说:君子生非异也,善假于物也.--荀子 Code_流苏(CSDN) o(‐^▽^‐)o很高兴你打开了这篇博客,跟着步骤一步步尝试安装吧.✧ 目录 一.下载MySQL 二.安装MySQL 三.配置M ...

  4. sql server的密码采用自带什么密码技术存储_【技术分享】浅谈MYSQL 8.0新特性

    于树文 云技术管理处 01 MySQL 8.0中添加的功能 1. 新的系统字典表 整合了存储有关数据库对象信息的事务数据字典,所有的元数据都用InnoDB引擎进行存储. 2. 支持DDL 原子操作 I ...

  5. mysql+8.0+新特性_MySQL 8.0备受瞩目的新特性大放送!

    原标题:MySQL 8.0备受瞩目的新特性大放送! 作者介绍 杨奇龙,目前就职于有赞科技,负责数据库运维工作,熟悉MySQL性能优化.故障诊断.性能压测. MySQL于 2016-09-12正式发布8 ...

  6. 千呼万唤始出来,MySQL 8.0索引三剑客之函数索引

    MySQL 8.0新特性专栏目录 <MySQL开发规范>过时了,视图查询性能提升了一万倍 你真的会用EXPLAIN么,SQL性能优化王者晋级之路 索引三剑客之降序索引和不可见索引 千呼万唤 ...

  7. MySQL 8.0新特性之INTERSECT和EXCEPT

    最近几年,MySQL 不断致力于兼容 SQL 标准.例如 MySQL 8.0 中的窗口函数.通用表表达式.检查约束等等. 最新发布的 MySQL 8.0.31 继续对 SQL 语句进行了增强,提供了缺 ...

  8. 写最好的Docker安装最新版MySQL8(mysql-8.0.31)教程(参考Docker Hub和MySQL官方文档)

    一.前言   MySQL官方安装包下载地址:   https://dev.mysql.com/downloads/mysql/     Docker Hub官方网址:   https://hub.do ...

  9. 发布json数据_技术分享 | MySQL 8.0.17 GA 发布!

    昨日 MySQL 官网正式发布 8.0.17 / 5.7.27 / 5.6.45 三个(维护)版本,距离上一个 GA 版本(8.0.16)发布时隔仅 88 天! MySQL 各开发团队的博客网站,同一 ...

最新文章

  1. Mac上搭建Nginx + rtmp
  2. javascript的词法作用域
  3. CVPR 2022放榜!录用 2067 篇,接收数量上升24%
  4. matlab求二元函数极值算法_最优化计算与matlab实现(3)——进退法
  5. 工业大数据的真正意义和价值
  6. 去掉“3_人民日报语料”中每行前边的数字编号,改成“1, 2,......”
  7. [BUUCTF-pwn]——bjdctf_2020_babyrop
  8. (旧)走遍美国——(一、整体)
  9. java swing 动态生成表格_6 个曾经牛逼哄哄的 Java 技术,你用过吗?
  10. 1.无重复字符的最长子串
  11. 抖音音乐品牌升级 推出“炙热星河”音乐人服务平台
  12. 全网首发:doubango提示text relocations错误的解决办法
  13. 学会提问-批判性思维指南运用
  14. VR全景制作教程,拍摄VR全景图片其实很简单
  15. 设置Win10防火墙规则,使得局域网能访问此电脑的Tomcat服务器
  16. 无线路由器的dhcp服务器如何设置,无线路由器怎么设置dhcp服务器
  17. 标致携手《VISION视觉》与建筑师刘威畅想设计的未来
  18. 安装配置nagios+nrpe+nconf
  19. “稳”字当头 | 陆金所控股持续聚焦小微信贷,深耕财富管理,一季度业绩稳健增长
  20. 合肥科大讯飞-AI研究算法工程师(视觉感知) 招聘贴

热门文章

  1. 科创企业落地,海内外高层次人才引进
  2. gitlab runner下载安装注册+卸载 + shell指令没执行的问题
  3. 扩展阿里巴巴 Java 开发规约插件,打造团队专属风格!
  4. 工厂中的流水线竟然是活生生的建造者模式
  5. 小马哥---山寨苹果6sp E165刷机拆机主板图与开机识别图 低仿机型 6572芯片
  6. RV1126/RV1109开发之路
  7. 知识图谱应用——煤矿安全知识图谱构建技术研究学习
  8. npm install 安装use String.prototype.padStart()卡住(已解决)
  9. PHP函数json_decode的用法,PHP json_decode()用法及代码示例
  10. 光说不练假把式(一)