技术分享 | MySQL 并行 DDL

MySQL8.0 InnoDB并行查询特性 概述 MySQL经过多年的发展已然成为最流行的数据库,广泛用于互联网行业,并逐步向各个传统行业渗透。之所以流行,一方面是其优秀的高并发事务处理的能力,另一方面也得益于 MySQL 丰富的生态。MySQL 在处理 OLTP 场景下的短查询效果很好,但对于复杂大查询则能力有限。最直接一点就是,对于一个 SQL 语句,MySQL 最多只能使用一个 CPU 核来处理,在这种场景下无法发挥主机CPU多核的能力。MySQL 没有停滞不前,一直在发展,新推出的8.0.14版本第一次引入了并行查询特性,使得check.. 阅读详情

作者:李鹏博

爱可生 DBA 团队成员,会变身,主要负责 MySQL 故障处理和 SQL 审核优化。对技术执着,为客户负责。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


随着 MySQL 版本的不断更新,对 DDL 操作的支持也在不断的完善和更新:比如从 MySQL 5.6 引入 Online DDL ,在 MySQL 5.7 对 Online DDL 进一步完善,到现在的 8.0 版本,则对 DDL 的实现重新进行了设计,比如 DDL 操作支持原子特性,在 MySQL 8.0.27 引入并行 DDL 。本篇就来探究一下 MySQL 8.0.27 的并行 DDL 对于 DDL 操作速度的提升。

MySQL 8.0.14 引入了 innodb_parallel_read_threads 变量来控制扫描聚簇索引的并行线程。MySQL 8.0.27 引入了 innodb_ddl_threads 变量来控制用于创建二级索引时的并行线程数量,此参数一般和一并引入的 innodb_ddl_buffer_size 一起使用,innodb_ddl_buffer_size 用于指定进行并行 DDL 操作时能够使用的 buffer 大小,buffer 是在所有的 DDL 并行线程中平均分配的,所以一般如果调大 innodb_ddl_threads 变量时,也需要调大 innodb_ddl_buffer_size 的大小。

innodb_ddl_threads 、innodb_ddl_buffer_size 和 innodb_parallel_read_threads 的默认大小分别为:

mysql> select @@global.innodb_ddl_threads;
+-----------------------------+
| @@global.innodb_ddl_threads |
+-----------------------------+
|                           4 |
+-----------------------------+
1 row in set (0.00 sec)

mysql> select @@global.innodb_ddl_buffer_size;
+---------------------------------+
| @@global.innodb_ddl_buffer_size |
+---------------------------------+
|                         1048576 |
+---------------------------------+
1 row in set (0.00 sec)

mysql> select @@global.innodb_parallel_read_threads;
+---------------------------------------+
| @@global.innodb_parallel_read_threads |
+---------------------------------------+
|                                     4 |
+---------------------------------------+
1 row in set (0.00 sec)

接下来测试一下调大 innodb_ddl_threads 、innodb_ddl_buffer_size 和 innodb_parallel_read_threads 参数值对 DDL 操作的性能提升。

首先创建一张 5000 万的表:

-- 数据库版本为8.0.28
mysql> select @@version;
+----------+
| @@version|
+----------+
| 8.0.28   |
+----------+
1 row in set (0.00 sec)

-- buffer pool大小为24G
mysql> select @@global.innodb_buffer_pool_size;
+----------------------------------+
| @@global.innodb_buffer_pool_size |
+----------------------------------+
|                      25769803776 |
+----------------------------------+
1 row in set (0.001 sec)

mysql> create database action;
Query OK, 1 row affected (0.01 sec)

# sysbench /usr/share/sysbench/oltp_read_write.lua --mysql-socket=/data/mysql/data/3306/mysqld.sock  --mysql-user=root --mysql-password='123' --mysql-db=action --tables=1 --table-size=50000000 --report-interval=1 --threads=8 prepare

mysql> select count(*) from action.sbtest1;
+----------+
| count(*) |
+----------+
| 50000000 |
+----------+
1 row in set (21.64 sec)

-- 表空间大小为12G
# ll -h
total 12G
-rw-r-----. 1 mysql mysql 12G Jan 20 17:38 sbtest1.ibd

分别测试不同的线程数量和缓冲区大小的 DDL 操作时间,例如:

-- 设置并发DDL线程为1
mysql> set innodb_ddl_threads = 1;
Query OK, 0 rows affected (0.01 sec)

-- 设置buffer大小为512M
mysql> set innodb_ddl_buffer_size = 536870912;
Query OK, 0 rows affected (0.00 sec)

-- 设置并行索引扫描线程为1
mysql> set innodb_parallel_read_threads = 1;
Query OK, 0 rows affected (0.01 sec)

-- 执行DDL操作
mysql> alter table action.sbtest1 add index idx_c(c);
Query OK, 0 rows affected (6 min 54.21 sec)
Records: 0  Duplicates: 0  Warnings: 0

-- 查看DDL的内存最大占用
mysql> select event_name,CURRENT_NUMBER_OF_BYTES_USED/1024/1024 from performance_schema.memory_summary_global_by_event_name where event_name='memory/innodb/ddl';
+-------------------+----------------------------------------+
| event_name        | CURRENT_NUMBER_OF_BYTES_USED/1024/1024 |
+-------------------+----------------------------------------+
| memory/innodb/ddl |                           513.08750916 |
+-------------------+----------------------------------------+
1 row in set (0.00 sec)

通过不断调整相关参数得到以下结果:

innodb_ddl_threadsinnodb_ddl_buffer_sizeinnodb_parallel_read_threadsDDL 占用最大内存DDL 时间
1512M1513M6 min 54.21 sec
21G21230M4 min 12.08 sec
42G42735M3 min 43.01 sec
84G85791M3 min 19.63 sec
168G165975M3 min 12.33 sec
3216G326084M3 min 11.11 sec

可以看到,随着并发线程的增多和 buffer 的增加,DDL 操作所占用的资源也越多,而 DDL 操作所花费的时间则越少。不过通过对比资源的消耗和 DDL 速度的提升比例,最合理的并行线程数量为4-8个,而 buffer 大小可以根据情况进行调整。

参考链接:https://dev.mysql.com/doc/refman/8.0/en/online-ddl-parallel-thread-configuration.html

C# & SQL Server 实时数据同步:7步轻松搞定,代码详解 实时数据同步是指在一个数据库中的数据发生变化时,能够立即或近乎立即地将这些变化同步到另一个数据库中。这种同步可以是单向的(从源数据库同步到目标数据库),也可以是双向的(两个数据库互相同步)。通过本文的详细讲解和代码示例,相信你已经学会了如何使用C#和SQL Server实现数据库的实时数据同步。实时数据同步不仅可以提升系统的响应速度,还能确保数据的一致性和准确性。希望这篇教程对你有所帮助,期待你在C#编程中取得更大的成就!🌟✨如果你有任何问题或建议,欢迎在评论区留言交流! 阅读详情

相关推荐

【智能车学习】电磁循迹中的基本控制算法

今天心血来潮,突然想总结一下电磁车的一些基本算法,也希望可以给新手同学们一点帮助和参考。本篇主要讲述智能车电磁循迹中涉及到的基本算法,包括滤波算法,归一化算法,PID控制等

Carry_qing的博客 6万+

Oracle 并行 QC PX

概念 串行执行: 串行执行时候,sql语句由一个server process处理(既只运行在一个cpu上),所以sql语句所能使用的资源受cpu限制,除去异步i/o外server process 处理cpu操作时,不可访问disk。 并行处理: 就是多个slave process一起处理同一个sql语句 概念 串行执行:串行执行时候,sql语句由一个server process处理(既只运行在一个cpu上),所以sql语句所能使用的资源受cpu限制,除去异步i/o外server process处..

jnrjian的博客 2327

ENSP实验一:防火墙基础配置

配置client(内网)、FTP Server(外网)的IP地址。进入防火墙,输入密码:默认为admin@123。

Carohuan的博客 1万+

mysql 并行查询_MySQL 8.0新特性-并行查询innodb_parallel_read_threads

原文很好翻译,直接读好理解长久以来MySQL没有并行查询,并且在其他数据库已经有了的情况下,MySQL终于在8.0.14版本开始有了自己的并行查询,但使用面非常的窄,只适用于并行聚集索引的count(*) 并且只是在没有where条件的情况下的查询mysql>setlocalinnodb_parallel_read_threads=1;QueryOK,0rowsaffected...

weixin_26804345的博客 2426

1.5 RAG技术栈全景图:LangChain vs LlamaIndex深度对比,选错框架后悔3年,一文帮你选对

摘要:LangChain与LlamaIndex框架深度对比 本文全面对比了RAG领域两大主流框架LangChain和LlamaIndex。LangChain是通用AI应用框架,具有模块化设计和丰富生态;LlamaIndex专为RAG优化,提供开箱即用解决方案。功能对比显示,LangChain在文档加载和Agent支持方面更强,而LlamaIndex在检索策略、向量存储和多模态处理上表现更优。代码示例展示了二者实现RAG的不同方式:LangChain需要更多配置但灵活性高,LlamaIndex则提供更简洁的A

yonggeit的博客 3238

基于MATLAB的特征模式分解(FMD)算法详解

本文详细介绍了基于MATLAB的特征模式分解(FMD)算法实现。FMD是一种新型自适应信号分解方法,通过自适应FIR滤波器组和相关峭度优化目标,有效解决传统方法(如EMD、VMD)的模态混叠问题。文章系统阐述了FMD的算法原理、数学模型和实现步骤,包括自适应FIR滤波器设计、相关峭度优化和模态选择机制。与现有方法相比,FMD在旋转机械故障诊断中展现出更强的特征提取能力和噪声鲁棒性。MATLAB实现部分包含核心函数、参数优化和可视化工具,并通过轴承故障等案例验证了算法的有效性。

qq_42212808的博客 192

8.0 新特性 - innodb_ddl_threads

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

分享既学习 794

攻克反光难题!YOLOv9工业缺陷检测实战:高反光件、微小划痕精准识别(附抗反光代码+产线数据)

文章摘要:本文针对不锈钢、铝合金等高反光工业件的缺陷检测难题,提出了一套“硬件抗反光+YOLOv9小目标增强”的解决方案。通过分析反光干扰(镜面/漫反射)和微小划痕(0.1mm级)两大核心问题,详细介绍了500万像素工业相机+偏振光源的硬件配置方案,以及基于偏振图像融合和超分辨率放大的预处理方法。最终实现误检率1.2%、微小划痕检出率99.3%的工业级检测效果,并提供了可落地的代码实现和车间实测数据。(148字)

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1037

探索InnoDB并行读

导读: 作者:蒋乐兴 MySQL-DBA 目前在 github 上维护着两套 MySQL 开源工具 mysqltools & dbm(dbm-agent dbm-center),对机器学习和程序化交易也有些心得。 一、innodbparallelread_threads 这个参数控制着聚集索引扫描时 innodb 层面的并发数,核心数无限的情况下并发数越大,返回结果的时间就越短 二...

Evelyn_Lv的博客 432

8.DJI-PSDK:一站式项目功能开发总结(空中气象站项目/激光甲烷检测项目)

本文将以一篇文章的幅度快速完成: 项目一:空中气象站项目; 项目二:激光甲烷项目; 项目所使用的PSDK来源于第0章节末尾的百度网盘;解压:Payload-SDK-3.8.zip代码所在目录:双击打开: 修改打印串口和相关波特率,我们修改如下: 进行相关编译选项配置如下: :

哒宰的博客 293

ESP32-C3蓝牙透传通信的BLE协议栈工程实践

蓝牙低功耗(BLE)透传是一种基于GATT服务模型的数据透明传输机制,其核心原理在于Peripheral设备通过广播建立连接,并在GATT Server层暴露可读写特征值实现双向数据通道。该技术具备低功耗、跨平台兼容性强、开发门槛适中等优势,广泛应用于智能硬件、工业传感器与嵌入式网关等场景。在实际工程中,透传稳定性高度依赖BLE协议栈的分层协同——Link Layer负责可靠连接建立,GATT Server则定义数据交互语义;而ESP32-C3的AT指令集正是对这两层能力的封装调度。本文聚焦BLE透传的关键

weixin_29859471的博客 121

[技术分享]一招解决 MySQL 中 DDL 被阻塞的问题

该表是MySQL 5.7引入的,会显示MDL的相关信息,包括作用对象、锁的类型及锁的状态等。这个时候,我们需要对上述2n条记录进行过滤。所以,在MySQL 5.7中,如果我们要使用 sys.schema_table_lock_waits,必须首先开启MDL 相关的 instrument。sys.schema_table_lock_waits 是 MySQL 5.7 引入的,用来定位 DDL 被阻塞的问题。定位导致DDL被阻塞的会话,常用的方法如下:sys.schema_table_lock_waits。

一个只求实际的程序猿 1390

[QMT量化交易小白入门]-105、震荡市最适合的策略:ETF多标的动态网格策略,回测年化收益47.81%

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 2060

记一次mysql执行DDL导致锁表

背景 线上某数据库意外发现缺少索引,并且该表的数据量很少,只有几万条记录而已,因此很随意地尝试给该表添加索引。原本预期该表的记录很少,添加索引的耗时应该很短,结果却直接导致该表被锁,所有该表的增删改查操作全部阻塞,继而影响到了线上业务。 发现锁表后,执行show processlist发现大量线程阻塞,状态显示Waiting for table metadata lock。通过命令终止了DDL线程,该表恢复正常。mysql从5.6版本起支持Online DDL,理论上执行DDL语句不会阻塞诸如INSERT、

祈雨v的博客 6060

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

技术分享 | 一招解决 MySQL 中 DDL 被阻塞的问题

作者分享如何判断一个 DDL 是否被阻塞,以及如何定位阻塞 DDL 会话的解决思路。

ActionTech的博客 942

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

聊聊 MySQL 的 Online DDL

在MySQL使用过程中,根据业务的需求对表结构进行变更是个普遍的运维操作,这些称为DDL操作。常见的DDL操作有在表上增加新列或给某个列添加索引。我们常用的易维平台提供了两种方式可执行DDL,包括MySQL原生在线DDL(online DDL)以及一种第三方工具pt-osc。下图是执行方式的性能对比及说明:本文将对DDL的执行工具之Online DDL进行简要介绍及分析,pt-osc会专门再进行介绍。

m0_71777195的博客 2056

java有趣的技术分享ppt_技术分享 | 关于 MySQL Online DDL 有趣的验证

作者:胡存存爱可生 DBA 团队成员,主要负责 MySQL 故障处理和 SQL 审核优化。对技术执着,为客户负责。本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。MySQL 在 5.6 引入 Online DDL 之后,在 5.7 和 8.0 版本又对这一功能进行了大幅的优化。尤其是在 8.0 之后,已经实现了列的秒加。在 5.7 中有些 DDL 操...

weixin_42153793的博客 974

mysql中ddl是什么_MySQL中DDL是什么意思

MySQL中DDL是什么意思发布时间:2020-11-20 14:34:51来源:亿速云阅读:80作者:小新这篇文章将为大家详细讲解有关MySQL中DDL是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。MySQL中的DDL代表着数据库定义语句,用来创建数据库中的表、索引、视图、存储过程、触发器等。常用的语句关键字有:CREATE,ALTER,DROP,T...

weixin_30158471的博客 3714

MySQL数据库——DDL基本操作

MySQL数据库DDL操作——创建、删除库、创建、查看、修改表结构

不能再留遗憾了的博客 1274

MySQL DDL执行方式-Online DDL介绍

日常开发我们对一条DML语句较为熟悉,很多开发人员都了解sql的执行过程,比较熟悉,但是DDL是如何执行的呢,大部分开发人员可能不太关心,也认为没必要了解,都交给DBA吧。 其实不然,了解一些能尽量避开一些ddl的坑,那么下面带大家一起了解一下DDL执行的方式。

京东科技开发者 828

一文掌握MySQL的DDL、DML、DCL

以上就是MySQL的基础内容,不知道是否对你有所帮助,记得在评论区告诉方才。最后附上Msyql知识图谱,后续该专栏,会参考该图谱,逐步完善内容,如果你近期正在学习MySQL,记得关注方才哟。下期预告:以RBAC角色权限管理模型为例,进行MySQL实战。

方才coding 933

mysql 5.7 online ddl_技术分享 | 关于 MySQL Online DDL 有趣的验证

作者:胡存存爱可生 DBA 团队成员,主要负责 MySQL 故障处理和 SQL 审核优化。对技术执着,为客户负责。本文来源:原创投稿*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。MySQL 在 5.6 引入 Online DDL 之后,在 5.7 和 8.0 版本又对这一功能进行了大幅的优化。尤其是在 8.0 之后,已经实现了列的秒加。在 5.7 中有些 DDL 操...

weixin_39691055的博客 194

MySQL的Online DDL语句

微信搜索“coder-home”或扫一扫下面的二维码, 关注公众号,第一时间了解更多干货分享,还有各类视频教程资源。扫描它,带走我 文章目录MySQL的Online DDL语句概念诉求背景解决方法原生支持的方式使用第三方工具下载安装Percona Toolkit下载二进制压缩包使用yum来安装使用Percona Toolkit冗余字段主从延迟的规避 MySQL的Online DDL语句 概念 什么是Online DDL?在了解Online DDL之前,我们先来了解一下什么是DDL。 说到DDL,就不得.

程序猿集锦的博客 889

MySQL数据库 DDL 阻塞问题定位 【转载】

1)执行 show processlist ,如果 DDL 的状态是 Waiting for table metadata lock ,则意味着这个 DDL 被阻塞了。这种方法适用于 MySQL 5.7 和 8.0。注意,MySQL 5.7 中,MDL 相关的 instrument 默认没有打开。Kill DDL 之前的会话'))) p如果 MySQL 5.7 中 MDL 相关的 instrument 没有打开或在 MySQL 5.6 中,可使用该方法。

hongjian006的博客 920
上一篇: 故障分析 | MySQL:唯一键约束失效
下一篇: 故障分析 | MongoDB 5.0 报错 Illegal instruction 解决
爱可生开源社区
博客等级 码龄8年 1936粉丝 1004原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值