从 14 秒到 1 秒:MySQL DDL 性能优化实战
1. 问题背景
MySQL版本:8.0.30
测试表数据量:200万
在 MySQL 中,研发人员最初执行了以下 SQL 语句,向表 t_email 中添加了一个允许为 NULL 的列 id3,并设置了默认值为 0:
ALTER TABLE t_email ADD COLUMN id3 INT NULL DEFAULT 0;
随后发现需要将该列修改为 NOT NULL,于是尝试执行以下语句:
ALTER TABLE t_email MODIFY COLUMN id3 INT NOT NULL DEFAULT 0;
然而,直接修改时发现无法使用 ALGORITHM=INSTANT,只能使用 ALGORITHM=INPLACE 或 ALGORITHM=COPY,导致操作耗时较长(14.67 秒)。
后续的测试中改为先删除列,再重新添加列的方式,成功使用了 ALGORITHM=INSTANT,速度显著提升。
2. 问题分析
- ALGORITHM=INSTANT 的限制
8.0.12 新添加了INSTANT算法。
MySQL 的 ALGORITHM=INSTANT 是一种快速修改表结构的算法,但它仅支持特定的 DDL 操作。
添加和删除列是支持的,修改列的NULL或NOT NULL不支持.
在尝试将列从 NULL 修改为 NOT NULL 时,ALGORITHM=INSTANT 不支持此操作,因此 MySQL 只能使用 ALGORITHM=INPLACE 或 ALGORITHM=COPY,导致操作耗时较长。
Table 17.18 Online DDL Support for Column Operations - ALGORITHM=INPLACE 和 ALGORITHM=COPY 的开销
ALGORITHM=INPLACE:在表上直接修改元数据,但仍可能需要重建表数据。
ALGORITHM=COPY:创建新表并复制数据,完成后删除旧表。这种方式通常较慢,尤其是在表数据量较大时。 - 删除列并重新添加列的优化
通过删除列并重新添加列的方式,可以绕过 MODIFY COLUMN 的限制,直接使用 ALGORITHM=INSTANT,从而显著提升性能。
3. 解决方案
- 原始方案
添加允许为NULL的列id3,并设置了默认值为0
mysql> alter table t_email add column id3 int null default 0;
Query OK, 0 rows affected (0.86 sec)
Records: 0 Duplicates: 0 Warnings: 0
将列的属性修改为不允许为NULL,其他不变
mysql> alter table t_email modify column id3 int not null default 0;
Query OK, 0 rows affected (14.67 sec)
Records: 0 Duplicates: 0 Warnings: 0
- 优化后的方案
添加允许为NULL的列id3,并设置了默认值为0。
mysql> alter table t_email add column id3 int null default 0, ALGORITHM=INSTANT;
Query OK, 0 rows affected (0.85 sec)
Records: 0 Duplicates: 0 Warnings: 0
删除id3列,耗时0.98秒。
mysql> alter table t_email drop column id3, ALGORITHM=INSTANT;
Query OK, 0 rows affected (0.98 sec)
Records: 0 Duplicates: 0 Warnings: 0
重新添加id3列,将属性改为NOT NULL,并设置了默认值为0,耗时0.68秒。
mysql> alter table t_email add column id3 int not null default 0, ALGORITHM=INSTANT;
Query OK, 0 rows affected (0.68 sec)
Records: 0 Duplicates: 0 Warnings: 0
4. 总结
ALGORITHM=INSTANT 的限制:不支持修改列的 NULL 属性。仅支持特定的 DDL 操作(如添加列、删除列)。虽然不会操作不会阻塞DML,但是在DDL刚开始和结束时,都要获取MDL,如果这两个阶段表上有事务,DDL会因为获取不到MDL而被阻塞。
优化思路:对于不支持 ALGORITHM=INSTANT 的操作,可以尝试通过删除列并重新添加列的方式绕过限制。这种方式在表数据量越大时,性能提升越明显。
从 14 秒到 1 秒:MySQL DDL 性能优化实战的更多相关文章
- Mysql数据库性能优化(一)
参考 http://www.jb51.net/article/82254.htm 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要 ...
- mysql数据库性能优化(包括SQL,表结构,索引,缓存)
优化目标减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当 ...
- MySQL数据库性能优化的关键参数(转)
我们在进行数据库管理和开发中经常会遇到性能问题,这就涉及到MySQL的性能优化.通过在网络上查找资料和笔者自己的尝试,我认为以下系统参数是比较关键的: 关键参数一:back_log 要求 MySQL ...
- MySQL 数据库性能优化之缓存参数优化
在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣 ...
- 到底该不该使用存储过程 MySQL查询性能优化一则
到底该不该使用存储过程 看到<阿里巴巴java编码规范>有这样一条 关于这条规范,我说说我个人的看法 用不用存储过程要视所使用的数据库和业务场景而定的,不能因为阿里巴巴的技术牛逼,就视 ...
- DB-MySQL:MySQL 语句性能优化
ylbtech-DB-MySQL:MySQL 语句性能优化 1.返回顶部 1. MySQL概述1.数据库设计 3范式2.数据库分表分库---会员系统() 水平分割(分页如何查询)MyChar .垂直3 ...
- MySQL数据库性能优化与监控实战(阶段四)
MySQL数据库性能优化与监控实战(阶段四) 作者 刘畅 时间 2020-10-20 目录 1 sys数据库 1 2 系统变量 1 3 性能优化 1 3.1 硬件层 1 3.2 系统层 1 3.3 软 ...
- 1229【MySQL】性能优化之 Index Condition Pushdown
转自http://blog.itpub.net/22664653/viewspace-1210844/ [MySQL]性能优化之 Index Condition Pushdown2014-07-06 ...
- 深入理解MySQL开发性能优化.pptx
深入理解MySQL开发性能优化.pptx,依旧上传baidu pan http://pan.baidu.com/s/1jIwGslS,视频暂未出,培训完成后会更新.
- MySQL 数据库性能优化之索引优化
接着上一篇 MySQL 数据库性能优化之表结构,这是 MySQL数据库性能优化专题 系列的第三篇文章:MySQL 数据库性能优化之索引优化 大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引 ...
随机推荐
- ClickHouse 物化视图学习总结
物化视图 物化视图源表--基础数据源 创建源表,因为我们的目标涉及报告聚合数据而不是单条记录,所以我们可以解析它,将信息传递给物化视图,并丢弃实际传入的数据.这符合我们的目标并节省了存储空间,因此我们 ...
- electron项目icon显示异常
前情 公司有个桌面端项目是基于Electron开发的. 坑 构建打包好的项目在桌面和任务栏上图标显示正常,但是在任务栏弹框上左上角的图标确不显示 Why? 经过反复搜索,网上有文章说如果ico图标过大 ...
- 【字符串哈希+二分】AcWing3508 最长公共子串
题解 首先思考暴力枚举长度为 \(len∈[1, min(strlen(s), strlen(t))]\),最差情况下为字符串 \(s\) 和字符串 \(t\) 全为长度为 \(10000\) 的全英 ...
- Java8使用Stream实现List中对象属性的合并(去重并求和)
前言 在需求开发中,我们需要对一个List中的对象进行唯一值属性去重,属性求和,对象假设为Pool,有name.value两个属性,其中name表示唯一值,需要value进行求和,并最后保持一份对象. ...
- ngrx 4: 创建 ngrx 4.x 项目
创建 @ngrx 4.x 项目 @ngrx 4.x 相比上一个版本有了一些变化,该文介绍了如何在 Angular 中集成 @ngrx r.x 实现状态管理. 一.创建基本项目 使用 Angular C ...
- Powershell 源码批判
代码里充斥着过程式编程的搞法:比如这里 Utils.PathIsUnc,分散的到处都是 internal static IEnumerable<string> GetDefaultAvai ...
- 【C#】接口的基本概念
目录 基本 什么是接口 接口与抽象类的区别 抽象类 接口 实例 设计接口 基本 什么是接口 C#接口(interface)是:用来定义一种程序的协定 实现接口的类或者结构要与接口的定义严格一致. 有了 ...
- Qt音视频开发17-vlc内核回调拿图片进行绘制
一.前言 在众多播放器中,支持的种类格式众多,并支持DVD影音光盘,VCD影音光盘及各类流式协议,提供了sdk进行开发,这点是至关重要的,尽管很多优秀的播放器很牛逼,由于没有提供sdk第三方开发,少了 ...
- Qt开发经验小技巧191-195
关于QList队列的处理中,我们最常用的就是调用append函数添加item,往前插入item很多人第一印象就是调用insert(0,xxx)来插入,其实QList完全提供了往前追加item的函数pr ...
- 【问题解决记录】vue解决低版本安卓与ios10以下系统兼容性问题
问题描述: 项目中的企业微信内部应用,使用Vue-cli搭建的H5页面web,在低版本的安卓手机或ios8.0.9.0中出现接口数据访问失败,HTTP状态码返回0的问题,无法正常使用系统.安卓手机主要 ...