2024-11-09
版权声明:本文为博主付费文章,严禁任何形式的转载和摘抄,维权必究。 本文链接:https://www.skjava.com/mianshi/baodian/detail/3287320214

回答

InnoDB 是支持行级锁的存储引擎。大多数情况下,InnoDB 加索引可以避免锁表。然而,具体情况取决于索引类型以及 MySQL 版本。如 MySQL5.6之后,由于推出 Online DDL 功能不会锁表;加主键索引和唯一索引会锁表,而加普通索引不会锁表。

扩展

一、Online DDL

从 MySQL5.6 开始,InnoDB 引入了 online ddl 功能,支持添加索引时减少对表的锁定,甚至避免锁表。在线 DDL 允许表在进行 DDL 操作(添加索引、删除索引、添加列等)时仍然支持读写操作。

// 常规加索引语句
ALTER TABLE t_employee ADD INDEX idx_age (age);

// 显示指定算法和加锁模式,与上面语句等价
ALTER TABLE t_employee ADD INDEX idx_age (age) ALGORITHM=INPLACE, LOCK=NONE;
  • ALGORITHM=INPLACE:指定使用就地(in-place)算法操作,意味着不会锁表。
  • LOCK=NONE:指定操作期间不锁表,允许并发读写。

与在线 DDL对应的是早期 MySQL 版本(MySQL5.6之前)使用离线 DDL。离线 DDL 创建索引期间,表将被锁定,阻止其他读写操作。

// 显示指定使用离线 DDL
ALTER TABLE t_employee ADD INDEX idx_age (age) ALGORITHM=COPY;