首页 > 数据库 >Mysql ALTER TABLE 加字段的时候到底锁不锁表?

Mysql ALTER TABLE 加字段的时候到底锁不锁表?

时间:2023-05-20 10:11:35浏览次数:45  
标签:该表 临时 DDL 原始 加字 Mysql 不锁表 ALTER

Mysql5.6版本之前
更新步骤

  • 对原始表加写锁
  • 按照原始表和执行语句的定义,重新定义一个空的临时表。
  • 对临时表进行添加索引(如果有)。
  • 再将原始表中的数据逐条Copy到临时表中。
  • 当原始表中的所有记录都被Copy临时表后,将原始表进行删除。再将临时表命名为原始表表名。

这样的话整个DDL过程的就是全程锁表的。
Mysql5.6版本之后
更新步骤

  • 对原始表加写锁
  • 按照原始表和执行语句的定义,重新定义一个空的临时表。并申请rowlog的空间。
  • 拷贝原表数据到临时表,此时的表数据修改操作(增删改)都会存放在rowlog中。此时该表客户端可以进行操作的。
  • 原始表数据全部拷贝完成后,会将rowlog中的改动全部同步到临时表,这个过程客户端是不能操作的。
  • 当原始表中的所有记录都被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秒之后,该表的查询、修改、新增操作都会陷入等待状态。

标签:该表,临时,DDL,原始,加字,Mysql,不锁表,ALTER
From: https://www.cnblogs.com/jelly12345/p/17416830.html

相关文章

  • 记录一次windows mysql5.7安装失败的过程
    首先下载mysql安装包windows版本 https://dev.mysql.com/downloads/installer/接着在执行安装mysqlmsi安装包最后一步的时候,显示FailedtostartserviceMySQL57.只有在任务处于完成状态(RanToCompletion、Fau这时候检查要么windows下面mysql的卸载残留没清理干净,要......
  • MySQL学习基础篇Day5
    4.约束4.1概述概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。目的:保证数据库中数据的正确、有效性和完整性。分类:约束描述关键字非空约束限制该字段的数据不能为nullNOTNULL唯一约束保证该字段的所有数据都是唯一、不重复的......
  • 《mysql高性能》系列3:创建合适的索引
    1概述索引可以认为是存储引擎建立的一种数据结构,用来快速的根据查询条件来找到所需要的数据。由于数据一般存放在磁盘中,每次访问磁盘的时间都会比较长,因此,为了减少对磁盘的访问次数,存储引擎一般使用B-树结构来保存索引。索引可以减少服务器层需要扫描的数据量,可以帮助服务器避免......
  • 《mysql高性能》系列4:字符集和校对
    对于字符串类型,有一个字符集的概念在里面。字符集是指,一种从二进制编码到某类字符符号的映射。例如,中文符号,在计算机底层用二进制存储,那么,就需要有一个映射表,来表示哪个中文符号用哪个二进制编码来表示。校对,是指一组用于某个字符集的排序规则。1mysql如何使用字符集只有基于字......
  • MySQL下载安装(Linux)
    Linux安装MySQL在线安装yum-yinstallmysql-server用Xshell,输入安装命令后,回车。源码安装下载源码进行编译安装、繁琐......
  • MySQL下载安装
    下载MySQL安装包登录MySQL官网:MySQL点击DOWNLOADS点击MySQLCommunity(GPL)Downloads点击MySQLCommunityServer点击Archives,选择需要的版本5.5版本及以下一般有MSI和ZIP两种。也可以下载5.7稳定版MySQLMSI版本是一种安装包,是一种微软安装程序,它支持一键安装,可......
  • MySQL
    数据库三大范式什么是范式?范式是数据库设计时遵循的一种规范,不同的规范要求遵循不同的范式。最常用的三大范式第一范式(1NF):属性不可分割,即每个属性都是不可分割的原子项。(实体的属性即表中的列)第二范式(2NF):满足第一范式;且不存在部分依赖,即非主属性必须完全依赖于主属性。......
  • Mysql重置主键id顺序
     消除因删除而产生错乱的主键id顺序altertable  表名  dropcolumnid;altertable  表名  addidmediumint(8)notnullprimarykeyauto_incrementfirst;  ......
  • 河北王校长MySQL
    河北王校长MySQL索引b+树数据结构\数量级\存储内容b+树优势、对比哈希表\数组\b树\跳表跳表不适用磁盘存储介质、指针管理难以适应联合索引、出现时间晚hash不支持最左前缀和范围查找数组成本过高b树树型过高,io多最左前缀原则索引覆盖索引下推扩充showindex命......
  • jsp页面连接mysql数据库报错“com.mysql.jdbc.Driver”
    今天在做web实验的时候数据库突然连不上了以下是报错我用的mysql包为mysql-connector-java:5.1.47找了好久后来在一篇博客的启发下,那篇博客中说把一般包为web下lib目录中后来我仔细观察,发现我添加的包在WEBINF目录下的classes下的lib中,难怪找不到我把它移动到外面就可以了......