MySQL系列四(alter锁表、批量删除导致IO出现瓶颈)

news/2024/12/23 6:16:11/

文章目录

  • alter锁表问题
  • 批量删除导致IO出现瓶颈

alter锁表问题

Mysql5.6版本之前 更新步骤

  1. 对原始表加写锁
  2. 按照原始表和执⾏语句的定义,重新定义⼀个空的临时表。
  3. 对临时表进⾏添加索引(如果有)。
  4. 再将原始表中的数据逐条Copy到临时表中。
  5. 当原始表中的所有记录都被Copy临时表后,将原始表进⾏删除。再将临时表命名为原始表表名。
  6. 这样的话整个DDL过程的就是全程锁表的。

Mysql5.6版本之后 更新步骤

  1. 对原始表加写锁
  2. 按照原始表和执⾏语句的定义,重新定义⼀个空的临时表。并申请rowlog的空间。
  3. 拷贝原表数据到临时表,此时的表数据修改操作(增删改)都会存放在rowlog中。此时该表客户端可以进⾏操作的。
  4. 原始表数据全部拷贝完成后,会将rowlog中的改动全部同步到临时表,这个过程客户端是不能操作的(insert 会报Duplicate entry 'XXX' for key 'XXX')。
  5. 当原始表中的所有记录都被Copy临时表,并且Copy期间客户端的所有增删改操作都同步到临时表。再将临时表命名为原始表表名。

总结:ALTER TABLE 加字段会加锁。只是Mysql5.6版本之后新增了ONLINE DDL的功能,可以使该表不能使⽤的时间⼤⼤缩短。

注意:ALTER TABLE 加字段的时候。如果该表的数据量⾮常⼤。不要设置default值。 ⽐如,当前有2000万以上数据量的表。如果加字段加了default值。Mysql会执⾏在执⾏Online DDL之后,对整个表的数据进⾏更新默认值的操作,即UPDATE table_name SET new_col = [默认值] WHERE TRUE,这样就相当于是更新了2000w+的数据,⽽且是在同⼀个事务⾥。也就是说这个事务会把整个表都锁住,直到所有的数据记录都更新完默认值以后,才会提交。这个时间⾮常长,⽽且由于会锁全表的记录,所以该表不可⽤的时间会⾮常长。

笔者实验过16核,32G,Mysql默认配置。500w的数据量加⼀个字段。不加default值,整个DDL更新过程是66秒。⽽且整个更新过程,该表的查询、修改、新增操作都是可⽤的。⼏乎对该表的可⽤性没有任何影响。加default值,整个DDL更新过程是213秒。经过测试,⼤约在100秒之后,该表的查询、修改、新增操作都会陷⼊等待状态。

批量删除导致IO出现瓶颈

背景:线上临时表积压数据过多,虽然有索引和数据归档,但是每日新增数据量>删除&归档数量,导致整体数据操作效率变慢。所以提交数据库删除工单,结果导致线上数据库半个小时内整个数据库集群链接不可用。

原因:数据表有大字段,根据ID一次性删除时数据库IO出现瓶颈。

解决办法:有大字段时,建议分批次删除,一次只删除50万~100万数据。


http://www.ppmy.cn/news/48192.html

相关文章

传统串口设备快速实现联网的解决方案(串口-以太网网关、Modbus网关、Modbus Poll/Slave调试软件的使用、Modbus报文数据实例分析)

【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》

Java实现复制文件

1、InputStream与OutputStream 创建两个文件 - 源和目标。然后我们从源创建InputStream并使用OutputStream将其写入目标文件进行 java 复制文件操作。 private static void copyFileUsingStream(File source, File dest) throws IOException { InputStream is null; …

SpringCloud消息总线——Bus

Bus 本专栏学习内容来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 在SpringCloud Config学习过程中,还遗留下来一个问题:当运维更新git上的配置信息时,要想更改所有的客户端服务,必须得手动给客户端服务发送post请…

蒙层禁止页面滚动

学习链接&#xff1a;蒙层禁止页面滚动的方案 <!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title>蒙层禁止页面滚动的方案<…

IMX6ULL---Yocto制作U-Boot

目录 1. U-Boot源码下载 2.增加U-Boot Recipe 3.修改U-Boot Recipe 4.编译U-Boot 5.U-Boot移植(EMMC版)

探讨接口测试颗粒度

偶然间在论坛上看到一个帖子&#xff0c;帖子内容如下&#xff1a; 假设现在有一个新增商品的接口&#xff0c;返回的参数中有新增商品的 id&#xff08;每次返回的 id 都不一样&#xff09;、success&#xff08;判断是否成功&#xff0c;0 失败 1 成功&#xff09; 1. 接口…

qt属性系统简介( Q_PROPERTY)

1、属性定义 Qt 提供一个 Q_PROPERTY()宏可以定义属性&#xff0c;它也是基于元对象系统实现的。Qt 的属性系统与C编译器无关&#xff0c;可以用任何标准的 C编译器编译定义了属性的 Qt C程序。 在QObiect 的子类中&#xff0c;用宏Q_PROPERTY()定义属性&#xff0c;其使用格式…

【Python_Scrapy学习笔记(十)】基于Scrapy框架的下载器中间件创建代理IP池

基于Scrapy框架的下载器中间件创建代理IP池 前言 本文中介绍 如何基于 Scrapy 框架的下载器中间件创建代理IP池。 正文 1、添加中间件的流程 在 middlewares.py 中新建 代理IP 中间件类在 settings.py 中添加此下载器中间件&#xff0c;设置优先级并开启 2、基于Scrapy框…