MySQL 8.0.31并行构建索引特性管窥

MySQL8.0新特性 MySQL 8.0:支持在线修改全局参数并持久化,通过加上PERSIST关键字,可以将修改的参数持久化到新的配置文件(mysqld-auto.cnf)中。函数索引基于虚拟列功能实现,在MySQL中相当于新增了一个列,这个列会根据你的函数来进行计算结果,然后使用函数索引的时候就会用这个计算后的列作为索引。MySQL 8.0:InnoDB会根据服务器上检测到的内存大小自动调整 innodb_buffer_pool_size,innodb_log_file_size 等参数,尽可能的冲分利用系统资源。 阅读详情
  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
  • GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。
  • 本文来源:原创投稿;作者:YeJinrong/叶金荣

测试效率提升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-16MySQL 8.0.31
平均耗时(秒)42.52931.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.20236.30%
64M23.44881.38%
64M + 8thds21.202100.59%
128M22.85686.07%
128M + 8thds21.45698.21%
256M22.04792.90%
256M + 8thds21.26699.99%
512M22.88585.84%
512M + 8thds23.22783.10%
1G25.23968.51%
1G + 8thds24.48673.69%

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

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

file

循环自动测试的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)
do
 echo "$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>&1
 mysql -f -S./$db/mysql.sock -e "select @@global.innodb_ddl_buffer_size" test
 mysql -N -s -q -f -S./$db/mysql.sock -e "alter table t1 drop index i1, drop index i2;" test > /dev/null 2>&1
 sleep 5
 time mysql -N -s -q -f -S./$db/mysql.sock -e "alter table t1 add index i1(k), add index i2(pad);" test
 echo ""
 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)
do
 echo "$db cycle $i"
 mysql -N -s -q -f -S./$db/mysql.sock -e "set global innodb_ddl_threads=8" test > /dev/null 2>&1
 mysql -f -S./$db/mysql.sock -e "select @@global.innodb_ddl_threads" test
 mysql -N -s -q -f -S./$db/mysql.sock -e "alter table t1 drop index i1, drop index i2;" test > /dev/null 2>&1
 sleep 5
 time mysql -N -s -q -f -S./$db/mysql.sock -e "alter table t1 add index i1(k), add index i2(pad);" test
 echo ""
 echo ""
 sleep 5
done

# 恢复 ddl threads=4
 mysql -N -s -q -f -S./$db/mysql.sock -e "set global innodb_ddl_threads=4" test > /dev/null 2>&1
 mysql -f -S./$db/mysql.sock -e "select @@global.innodb_ddl_threads" test
done

并行构建索引的限制

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

不支持虚拟列(virtual columns)。
不支持全文索引(full-text index)。
不支持空间索引(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.htm
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

Changes in MySQL 8.0.31
Configuring Parallel Threads for Online DDL Operations
Online DDL Memory Management https://dev.mysql.com/doc/refman/8.0/en/online-ddl-memory-management.html)


Enjoy GreatSQL 😃

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

相关链接: GreatSQL社区 Gitee GitHub Bilibili

MySQL 并行索引构建特性探究 MySQL 的并行索引构建特性利用多个线程并行处理索引的构建过程,从而加快索引的创建速度。MySQL 的并行索引构建特性是一个强大的工具,可以显著提高索引构建的速度和效率。然而,在使用并行索引构建特性时,需要注意系统的负载和资源竞争问题,以确保数据库的稳定性能。为了加快索引的构建过程,MySQL 引入了并行索引构建特性,允许在多个线程中同时构建索引。并行索引构建的核心思想是将索引构建过程分解为多个独立的子任务,并行处理这些子任务,最后将它们的结果合并到一起。的表,然后启用了并行索引构建特性。 阅读详情

相关推荐

cocos creator接入微信登陆sdk ios篇

cocos creator接入微信登陆sdk ios篇 背景已经在Android篇里面交代过了,有兴趣的朋友可以再看看Android篇 步骤 去微信开放平台下载ios平台所需要的sdk 在“info”标签栏的“URL type“添加“URL scheme”为你所注册的应用程序id 在“info”标签栏的“LSApplicationQueriesSchemes“添加weixin 将SDK文件中...

凤小鹿的博客 6362

8.0 新特性 - innodb_ddl_threads

通过调整该参数,可以提升二级索引的创建速度。创建二级索引时,在排序和构建阶段,使用线程的个数,一定程度上可以加快索引的创建速度,默认为 4 个。

分享既学习 795

Temporal Anti-Aliasing(时域抗锯齿TAA)

首先说一下走样:一般分为时域走样(如旋转车轮)和空域走样(锯齿),但在 TAA 技术是采用时域相关叠加混合技术来解决空域走样的问题。 简单看一下空域抗锯齿 (Spatial Anti-Aliasing, SAA)相关技术,最普及的莫过于 MSAA,被各大渲染引擎采用,但是 MSAA 并不适用于延迟渲染 (Deferred Rendering),随之出现了很多基于形态学的后处理抗锯齿技术,如 MLAA,FXAA,SMAA 等(具体看参见图形_反走样技术总结相关介绍),虽然他们表现良好且支持延迟渲染,但是都会面

qq_35312463的博客 1万+

科普文:软件架构数据库系列之【MySQL8.0新特性-并行DDl-innodb_ddl_threads】

前面我们讲到MySQL8.0.14版本增加了其第一个并行查询特性,可以支持在聚集索引上做SELECT COUNT()和check table操作。innodb_ddl_threads: 用于索引创建的最大并行线程数。MySQL 8.0.27 中添加。DDL 一向是业务的痛点,尤其是对大型表的 DDL 操作,具有操作时间久,对性能影响大,可能影响业务正常使用等问题。 本文详细解释 MySQL DDL 的原理,以及尽可能减少 DDL 对业务的影响的办法。

为无为,事无事,味无味。 1891

从零上手:基于RK3588平台的RKISP Tuner实战配置与核心功能解析

本文详细介绍了在RK3588平台上使用RKISP Tuner工具进行图像信号处理器(ISP)调试的完整实战流程。从MATLAB运行时环境搭建、服务端部署到核心连接,逐步解析如何通过图形化界面实时调节白平衡、锐化、降噪等参数以优化图像质量。文章重点阐述了实时预览、参数调试、抓图对比及参数保存等核心功能,为开发智能摄像头、机器人等AIoT设备的工程师提供了实用的配置指南与进阶技巧。

js777的博客 631

pytorch中dataloader的num_workers参数

结论速递 在Windows系统中,num_workers参数建议设为0,在Linux系统则不需担心。 1 问题描述 在之前的任务超大图上的节点表征学习中,使用PyG库用于数据加载的DataLoader,ClusterLoader等类时,会涉及到参数num_workers。在不同系统环境试验该参数的设定值时,会出现不同的结果 colab(Linux),设为12 有warning message,提示num_workers参数设置不合理,不影响继续运行 /usr/local/lib/python3.7/di

qq_40990057的博客 1万+

mysql datetime 索引 性能_MySQL性能优化的21个最佳实践 和 mysql使用索引

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情。当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能。这里,我们不会讲过 多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库。希望下面的这些优化技巧对你有用。1. 为查询...

weixin_35615322的博客 1288

OFDM调制matlab仿真详细代码

MATLAB仿真代码 % ================================================== % 作者: 肆拾伍 % 时间:11/30 2019 % 版本:V3 % =================OFDM仿真参数说明:================ % % 子载波数 carrier_count ---200 % 总符号数 symbol_count ...

肆拾伍的博客 3万+

[MySQL优化案例]系列 — slave延迟很大优化方法

备注:插图来自网络搜索,如果觉得不当还请及时告知 :)一般而言,slave相对master延迟较大,其根本原因就是slave上的复制线程没办法真正做到并发。简单说,在master上是并发模式(以InnoDB引擎为主)完成事务提交的,而在slave上,复制线程只有一个sql thread用于binlog的apply,所以难怪slave在高并发时会远落后master。ORACLE MySQL 5.6版...

老叶茶馆 308

Cocos2d-x手游逆向实战:Frida高阶Hook与动态解密技术

Cocos2d-x作为主流跨平台游戏引擎,其混合架构(C++核心+JNI桥接+Lua/JS脚本)和强加固策略(符号剥离、anti-frida、so加壳)使传统逆向方法失效。本文围绕‘无符号定位’‘C++函数硬编码地址识别’‘Lua层AST级劫持’‘OpenGL内存回溯解密’四大关键技术展开,深入解析如何在真实上线项目中稳定hook被strip的libcocos2d.so关键函数、绕过反调试心跳检测、从glTexImage2D参数逆向追踪明文资源,并结合熵值扫描实现零先验知识的内存明文发现。面向已掌握Frid

weixin_30345577的博客 675

深入解析Vivado FIFO的Standard与FWFT模式:性能对比与应用场景

本文深入解析了Vivado FIFO的Standard与FWFT两种工作模式的核心差异。通过对比数据就绪时机、读延迟、控制逻辑和有效深度等关键特性,并结合图像处理、数据包转发等典型应用场景,为FPGA设计者提供了清晰的选择依据和实战配置指南,帮助优化数据流性能与设计效率。

weixin_29219189的博客 254

MySQL 虚拟列和虚拟索引

MySQL 虚拟列和虚拟索引 是什么 Mysql 5.7 中推出了一个非常实用的功能 虚拟列 Generated (Virtual) Columns 在MySQL 5.7中,支持两种Generated Column,即Virtual Generated Column和Stored Generated Column,前者只将Generated Column保存在数据字典中(表的元数据),并不会将这一列数据持久化到磁盘上;后者会将Generated Column持久化到磁盘上,而不是每次读取的时候计算所得。

weixin_43939924的博客 8956

地磁场仿真与导航方案设计

地磁场仿真与导航方案设计 地磁场作为地球的固有资源,为航空、航天、航海提供了天然的坐标,可应用于航天器、航空飞行器和舰船等载体的定位、定向及姿态控制。本文依据地磁场的球谐模型,利用Matlab工具,设计了计算任意地点地磁场的程序,对仿真结果与实际数据进行对比分析;并选定一组卫星的数据,结合卫星的运动轨道,描绘90分钟内卫星处地磁总强度/矢量随轨道变化曲线,据此设计一种卫星地磁导航方案。 一、地磁场计算原理 1.1.球谐模型与球谐系数 地磁学的基本问题之一就是用数学表达式将地磁要素的地面分布表示成地理坐标的函

PRQKKK的博客 7408

mysql数据库大表加索引

最近大后台查看一些数据统计的时候,很慢,甚至会有超时情况,前端设置的超时时间是20秒。 后来通过查看日志和慢查询,发现一条sql语句执行时间超过18秒,基本都19秒左右。 select count(*) from tb_name where create_time > xxx; 最终得知是因为这个表数据行数已经超过 一千万了,然后create_time字段又没有索引 。 那解决办法肯定是加索引喽。 但是这个表是一直在线上运行,很重要和业务部分。如果给千万级的大表在线加索引 ,肯定会卡死

leo187的博客 3388

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

mysql8.0 性能优化配置 innodb_buffer_pool_size

缓冲池是主内存中的一个区域,InnoDB在访问表和索引数据时会在该区域进行缓存。缓冲池允许直接从内存访问频繁使用的数据,这加快了处理速度。在专用服务器上,通常会将高达80%的物理内存分配给缓冲池。为了提高高容量读取操作的效率,缓冲池被划分为可能容纳多行的页面。为了提高缓存管理的效率,缓冲池被实现为页面的链接列表;很少使用的数据使用最近最少使用(LRU)算法的变体从高速缓存中老化。了解如何利用缓冲池将频繁访问的数据保存在内存中是MySQL调优的一个重要方面。

1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Mysql 除了并行查询以外也可以并行索引,升级吧少年

POSTGRESQL 在 DDL DML DQL 都可以并行,之前MYSQL 在并行方面一直是软肋,MYSQL 8已经提供了DQL的并行,DDL 的并行也支持了,从MYSQL5.X 升...

sql server的专栏 1245

MySQL8.0新特性~索引新增特性

使用 invisible 创建表 或者 进行 表变更中设置索引为 隐藏索引。这时,索引隐藏不可见, 但是数据库会在后台继续维护隐藏。这个隐藏索引, 在查询时,甚至 force index 都不会使用。这个隐藏索引的主要作用是: 一些索引不确定是否有需要, 如果进行删除,后续又需要恢复这个索引, 假如数据量很大,那么就会耗费大量时间。这时就可以将索引设置为隐藏索引, 等需要时 直接恢复即可。

DBA_ChenJR的博客 870

MySQL索引失效与MySQL8新添加的索引特性

因为索引保存的是索引字段的原始值,而不是 id + 1 表达式计算后的值,所以无法走索引,只能通过把索引字段的取值都取出来,然后依次进行表达式的计算来进行条件判断,因此采用的就是全表扫描的方式。创建联合索引时,我们需要注意创建时的顺序问题,因为联合索引 (a, b, c) 和 (c, b, a) 在使用的时候会存在差别。而条件的左侧使用了占位符,导致无法按照正常的目录进行匹配,导致索引失效就很正常了。这里却是使用了索引。因为索引保存的是索引字段的原始值,而不是经过函数计算后的值,自然就没办法走索引了。

m0_57408211的博客 1297

MySQL创建索引并发_索引的创建与Explain的使用

索引是帮助mysql高效获取数据的数据结构,可以简单理解为,已经排好序的用于快速查找的数据结构。排序和快速查找是关键。索引会影响到order by排序。一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。索引的优势通过索引可以降低数据的查询成本,提高查询性能,降低数据库IO成本。通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。索引的劣势索引也...

weixin_39704246的博客 436

MySQL InnoDB Cluster部署方案与实践

MySQL InnoDB Cluster实验

m0_38004228的博客 3757

【高危】MySQL Server拒绝服务漏洞(CVE-2023-21912)

MySQL是Oracle开源的关系型数据库管理系统。 MySQL Server 受影响版本存在拒绝服务漏洞,攻击者者无需身份验证可发送连接数据包导致MySQL Server 崩溃拒绝服务。官方未公布相关细节,可能由于对客户端设置字符集的处理不当,当客户端字符集设置为ucs2、utf16、utf16le等进行连接时导致异常。

murphysec的博客 7180

PostgreSQL并行创建索引

PostgreSQL参数探究 最近在测试postgreSQL和Mysql之间的性能,发现无论是批量插入还是联合查询,PostgreSQL的性能都差着Mysql一大截。 怀疑是PostgreSQL的参数设定导致的性能限制,逐步的进行一些测试和总结 有时间的话接着测 PostgreSQL并行创建索引 (一)    通过调整postgreSQL的参数来启用多核并行创建索引 在postgreSQL11之后的版本中,新增了并行创建索引的功能,能够提供多核索引创建功能。同时postgre

WOD_MAAYA的博客 2623

Mysql 如何创建索引(Mysql 为例)

​ 索引的建立必须慎重,对每个索引的必要性都应该经过仔细分析,要有建立的依据。因为太多的索引与不充分、不正确的索引对性能都毫无益处:在表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。

qq_20025777的博客 2011

mysql并行建索引_Oracle使用并行建索引需要注意的问题

Oracle建索引时,我们为了建索引快,会加上并行,加上并行之后,此列索引就会是并行了。访问有并行度的索引时,CBO可能可能会考虑Oracle建索引时,我们为了建索引快,会加上并行,加上并行之后,此列索引就会是并行了。访问有并行度的索引时,CBO可能可能会考虑并行执行,这可能会引发一些问题,如在服务器资源紧张的时候用并行会引起更加严重的争用。当使用并行后,需要把并行度改回来。SQL> dro...

weixin_35678674的博客 658
上一篇: 实现一个简单的Database5(译文)
下一篇: JDK1.7下测试ConnectorJ连接MySQL8.0
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值