文章目录
- 1. Online DDL (MySQL 5.6+)
- 2. pt-online-schema-change 工具
- 3. gh-ost 工具
- 4. 对于MySQL 8.0+
- 注意事项
在MySQL中创建大型表索引时,传统方式会阻塞表的写操作,影响生产环境使用。以下是几种非阻塞创建索引的方法:
1. Online DDL (MySQL 5.6+)
从MySQL 5.6开始,InnoDB支持在线DDL操作:
ALTER TABLE table_name ADD INDEX index_name (column_name), ALGORITHM=INPLACE, LOCK=NONE;
ALGORITHM=INPLACE
:使用就地算法,避免表复制LOCK=NONE
:不获取锁,允许并发DML操作
2. pt-online-schema-change 工具
Percona提供的工具,通过创建影子表实现:
pt-online-schema-change --alter "ADD INDEX idx_name (column)" D=database,t=table --execute
3. gh-ost 工具
GitHub开源的在线模式变更工具:
gh-ost \
--database="database" \
--table="table" \
--alter="ADD INDEX idx_name (column)" \
--execute
4. 对于MySQL 8.0+
MySQL 8.0增强了在线DDL功能,默认情况下许多索引操作已经是非阻塞的:
ALTER TABLE table_name ADD INDEX index_name (column_name);
注意事项
- 在线DDL操作会消耗更多资源且执行时间更长
- 某些操作仍需要短暂的元数据锁(如添加全文索引)
- 空间需求:在线操作通常需要额外的临时空间
- 主键操作通常无法完全在线执行
对于大型生产表,建议在低峰期执行,并使用工具监控进度和影响。