MySQL大InnoDB表添加列超时,如何在线禁用全文索引后重建?
MySQL大表添加列超时(含大量全文索引)的解决方案
核心思路
你的判断是对的:删除全文索引后再执行加列操作,能大幅缩短表重建时间,之后再后台重建索引,可避免长时间锁表影响业务。
具体操作步骤
备份全文索引定义
先导出表结构,提取所有全文索引的定义,避免后续重建出错:SHOW CREATE TABLE myTable;复制输出中所有
FULLTEXT KEY开头的行,保存好。批量删除全文索引
一次执行多个DROP INDEX语句,减少锁表次数:ALTER TABLE myTable DROP INDEX ft_index_name1, DROP INDEX ft_index_name2, -- 替换为你实际的所有全文索引名称 ...;快速添加新列
此时表无全文索引,加列操作会大幅提速。MySQL 5.6+的InnoDB支持Online DDL,该操作仅会短暂锁表,不影响用户正常读写:ALTER TABLE myTable ADD COLUMN Column24 TEXT, ADD COLUMN Column25 TEXT, ADD COLUMN Column26 TEXT, ... AFTER lastColumn;后台重建全文索引
有两种可选方式,均能避免长时间阻塞业务:- 批量添加(推荐):一次执行多个
ADD FULLTEXT语句,利用Online DDL后台执行:ALTER TABLE myTable ADD FULLTEXT KEY ft_index_name1 (col1, col2), ADD FULLTEXT KEY ft_index_name2 (col3), -- 对应之前备份的索引定义 ...; - 逐个添加:若服务器负载较高,可分多次单独执行添加索引语句,每次锁表时间更短:
ALTER TABLE myTable ADD FULLTEXT KEY ft_index_name1 (col1, col2); ALTER TABLE myTable ADD FULLTEXT KEY ft_index_name2 (col3); ...
- 批量添加(推荐):一次执行多个
验证结果
- 确认表结构:
SHOW CREATE TABLE myTable;检查新列和全文索引是否都已存在 - 验证全文检索:执行
SELECT * FROM myTable WHERE MATCH(col1) AGAINST('测试关键词');确认功能正常
- 确认表结构:
注意事项
- 操作前必须做全表备份,比如用
mysqldump myDatabase myTable > backup.sql,防止意外 - 尽量在业务低峰期执行删除索引和加列操作,降低对业务的影响
- 若MySQL版本低于5.6,不支持完整的Online DDL,建议使用在线表结构变更工具(如pt-online-schema-change),避免锁表
内容的提问来源于stack exchange,提问作者MissMurple44
相关产品推荐
相关产品推荐

