MySQL中添加新列时一定会锁表吗

在 MySQL 中添加新列并不一定都会锁表,这取决于 MySQL 的版本、存储引擎以及使用的 SQL 语句和相关参数设置,下面详细介绍不同情况:

InnoDB 存储引擎

InnoDB 是 MySQL 中最常用的存储引擎,从不同版本来看添加新列时的锁表情况:
  • MySQL 5.6 之前
    • 默认情况:使用 ALTER TABLE 语句添加新列会进行表锁,也就是在执行添加列操作期间,会对整个表加锁,其他事务无法对该表进行读写操作。例如执行以下语句:
ALTER TABLE your_table_name ADD COLUMN new_column_name INT;

这会导致在添加列的过程中,该表被锁定,直到操作完成,这对于高并发场景下的数据库应用影响较大。
  • MySQL 5.6 及之后
    • 在线 DDL(Online DDL):引入了在线 DDL 功能,在某些情况下添加新列可以不锁表。当新列允许 NULL 值或者有默认值时,MySQL 可以在不锁表的情况下完成添加列操作。例如:
-- 添加允许 NULL 值的列
ALTER TABLE your_table_name ADD COLUMN new_column_name INT NULL;
-- 添加有默认值的列
ALTER TABLE your_table_name ADD COLUMN new_column_name INT DEFAULT 0;

不过,即使支持在线 DDL,在操作过程中也可能会有短暂的元数据锁(MDL),但这个锁持有的时间很短,对其他事务的影响较小。但如果新列不允许 NULL 值且没有默认值,MySQL 仍然可能需要对表进行锁表操作来保证数据的一致性。

MyISAM 存储引擎

  • 锁表情况:MyISAM 存储引擎不支持事务和行级锁,在使用 ALTER TABLE 语句添加新列时,会对整个表加写锁。在添加列的过程中,其他事务无法对该表进行读写操作,直到操作完成。例如:
ALTER TABLE your_table_name ADD COLUMN new_column_name VARCHAR(50);

在这个操作执行期间,该表被锁定,会严重影响数据库的并发性能。

其他影响因素

  • SQL 语句选项:在 ALTER TABLE 语句中可以使用一些选项来控制锁表行为。例如,在 MySQL 中可以使用 ALGORITHM 和 LOCK 子句。ALGORITHM 用于指定执行操作的算法,LOCK 用于指定锁的级别。示例如下:
ALTER TABLE your_table_name
ADD COLUMN new_column_name INT DEFAULT 0
ALGORITHM=INPLACE, LOCK=NONE;

ALGORITHM=INPLACE 表示使用原地算法进行操作,LOCK=NONE 表示不使用锁,允许在操作期间对表进行读写操作,但前提是操作支持这种模式。

posted on   阿陶学长  阅读(25)  评论(0编辑  收藏  举报

(评论功能已被禁用)
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示