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 可以在不锁表的情况下完成添加列操作。例如:
- 在线 DDL(Online DDL):引入了在线 DDL 功能,在某些情况下添加新列可以不锁表。当新列允许
-- 添加允许 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 表示不使用锁,允许在操作期间对表进行读写操作,但前提是操作支持这种模式。
浙公网安备 33010602011771号