回答
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;