首页 > 数据库 >MySQL 8.0 Online DDL操作的并行线程

MySQL 8.0 Online DDL操作的并行线程

时间:2022-12-22 16:47:10浏览次数:36  
标签:8.0 threads min buffer DDL 线程 sec ddl innodb

在MySQL 8.0.27中引入了新的参数:innodb_ddl_threads。表示在索引创建期间,在sort和build阶段可以使用的并发线程数。可以应用于在线ddl操作时创建或rebuild二级辅助索引。

参数innodb_ddl_threads要和innodb_ddl_buffer_size结合使用。innodb_ddl_buffer_size设置的buffer是所有线程公用的,每个线程能使用的buffer大小是:innodb_ddl_buffer_size/innodb_ddl_threads。

如果你增加了innodb_ddl_threads的大小,建议也增加innodb_ddl_buffer_size的大小。

如果你有快的存储、或多个CPU核,使用这些参数可以加快二级辅助索引的创建。

比如,这里有一张大表bookings。最初是默认设置:

SQL> alter table booking add index idx_2(flight_id, seat, passenger_id);
Query OK, 0 rows affected (9 min 0.6838 sec)

在MySQL8.0.27中,默认的设置是:

innodb_ddl_threads = 4
innodb_ddl_buffer_size = 1048576
innodb_parallel_read_threads = 4


为了确定如何设置innodb_ddl_threads最佳,先来看看有多少个cpu:

SQL> select count from information_schema.INNODB_METRICS where name = 'cpu_n';
+-------+
| count |
+-------+
|    16 |
+-------+


这个环境有16个内核。因为我的机器内存比较富裕,我将做如下的设置:

SQL> SET innodb_ddl_threads = 8;
SQL> SET innodb_parallel_read_threads = 8;
SQL> SET innodb_ddl_buffer_size = 1048576000;

SQL> alter table booking add index idx_2(flight_id, seat, passenger_id);
Query OK, 0 rows affected (3 min 9.1862 sec)

时间提高了很多。

以下是测试结果:

ddl buffer size		ddl threads		parallel read theads	                        execution time
1048576				4				4						9 min 0.6838 sec
104857600			8				8						4 min 8.3601 sec
1048576000			8				8						3 min 9.1862 sec
1048576000			16				16						3 min 7.4079 sec
1048576000			16				8						3 min 4.1161 sec
1048576000			12				4						3 min 8.7854 sec
1048576000			4				12						3 min 5.9497 sec
1048576000			4				4						3 min 12.2435 sec
2097152000			4				4						2 min 43.6280 sec
2097152000			8				8						2 min 44.6516 sec


从测试结果可以看到,增加buffer size的大小,可以达到最佳性能。
但是还有别的影响因素么?当然并非如此,还取决于你的数据量。而且持续加大buffer size之后,时间也不会继续减少。

这个参数也有助于在单个alter操作中构建多个索引:

SQL> alter table booking add index idx_2(flight_id, seat, passenger_id), add index idx_3(price, passenger_id), add index idx_4(seat,price);
Query OK, 0 rows affected (10 min 17.8435 sec)

如果使用默认设置,消耗的时间是28 min 46.9949 sec

标签:8.0,threads,min,buffer,DDL,线程,sec,ddl,innodb
From: https://www.cnblogs.com/abclife/p/16995790.html

相关文章

  • 解决线程安全方法2:同步方法
    【1】代码展示:packagecom.msb.test03;importsun.security.krb5.internal.Ticket;/***@author:liu*日期:10:38:04*描述:IntelliJIDEA*版本:1.0*/......
  • 一、【Java】多线程与高并发
    一、启动多线程的三种方式1、继承Thread接口类实现run()方法staticclassMyThredextendsThread{@Overridepublicvoidrun(){system.out.println("Hellow......
  • DDL使用
    CREATEDATABASE语句用于创建新的数据库MYSQL中的COLLATE是什么?(文章有详细介绍)https://cloud.tencent.com/developer/article/1366841?fromSource=waituiSQL> CREA......
  • 多线程原理和常用方法以及Thread和Runnable的区别
    多线程原理随机性打印CPU有了两条执行的路径,CPU就有了选择,一会执行main方法一会执行run方法。也可以说两个线程,一个main线程一个run线程一起请求CPU的执行权(执行......
  • 多线程下载USGS Lidar Explorer Map点云数据
    1.简介美国地质勘探局(UnitedStatesGeologicalSurvey,简称USGS),是美国内政部所属的科学研究机构。负责对自然灾害、地质、矿产资源、地理与环境、野生动植物信息等方......
  • CentOs8 MySQL8.0.31 忘记密码修改密码
     最近忙一段时间没有上来忘记了MySQL得密码了,因为之前得5.7版本得不一样所以还修改不了,啊哈哈首先进去/etc/my.cnf  插入skip-grant-tables :wq保存退出syste......
  • setDaemon 设置伴随线程
    【1】设置伴随线程将子线程设置为主线程的伴随线程,主线程停止的时候,子线程也不要继续执行了案例:皇上--》驾崩--》妃子陪葬结果:  packagecom.msb.test08;/**......
  • MySQL8.0新特性--基于Write Set并行复制
    复制简介MySQL早期只有单线程复制,即IO线程接收master的binlog,并写入本地的relaylog中,SQL线程负责从relaylog中服务event并进行apply。当主库的写入压力较大时,备库的IO线......
  • MySQL8.0新特性--Clone Plugin克隆
    ClonePlugin简介8.0.17引入cloneplugin,允许从本地或者远程的MySQL中克隆数据克隆的数据包括schema、表、表空间、元数据等等,克隆的数据是一个完整的数据目录,插件可以使......
  • MySQL8.0新特性--使用SQL管理undo表空间
    8.0之前的undotablespaces管理InnoDB的undolog最主要是存储回滚数据,是实现MVCC的重要组件;innodb的一个rollbacksegment分为1024个undologsegment,即最大支持1024个并......