MySQL数据库表里已有一亿条数据,此时要快速添加索引,应当采用什么具体操作流程和注意事项?
考察说明
考查对大数据量MySQL表加索引的实操经验与风险把控能力
回答思路
- 【回答框架 1】核心原则是利用在线DDL与分批处理降低锁表时间和主从延迟。优先使用ALGORITHM=INPLACE, LOCK=NONE来避免复制延迟和长时间锁表,但需确认存储引擎和MySQL版本支持,不支持时需评估业务低峰期执行。
- 【回答框架 2】备份与演练:加索引前在测试环境用相同数据量验证执行时间和资源消耗;生产环境提前备份,或利用从库先加索引再切换,减少对主库影响。
- 【回答框架 3】分批执行策略:若在线DDL仍造成压力,可按主键或唯一键范围分批创建索引,例如每批100万条,期间监控负载和延迟,批间暂停。但通常InnoDB在线加索引是整表重建,分批意义有限,更应关注IO和CPU。
- 【回答框架 4】监控与回滚:执行期间监控线程状态、锁等待、磁盘IO和主从延迟;准备回滚方案,但MySQL DDL多数不可中断回滚,需提前在测试环境确认时长。
- 【回答框架 5】低峰期操作:选择业务低峰时段,配合pt-online-schema-change等工具可进一步降低影响,但工具需额外评估兼容性。
- 【关键点 1】优先使用INPLACE算法和LOCK=NONE在线加索引,减少锁表时间
- 【关键点 2】操作前必须备份并在测试环境验证执行时间和资源消耗
- 【关键点 3】选择业务低峰期执行,并监控主从延迟和IO负载
- 【关键点 4】若使用pt-osc等工具,需评估其与原环境的兼容性和风险
- 【易错点 1】不要直接在生产环境执行未经验证的DDL,可能导致长时间锁表或复制中断
- 【易错点 2】忽略监控可能导致主从延迟累积,影响读业务
- 【易错点 3】误以为分批加索引能明显减少整体时间,实际在线DDL多为整表操作