删除无效索引:提升写入性能的维护技巧
一、识别无效索引的四大场景
历史遗留索引
业务迭代后废弃查询条件的索引(如旧版status
字段索引)。
检测方法:sql
-- MySQL 8.0+ 查看近30天未使用索引 SELECT index_name FROM sys.schema_unused_indexes WHERE object_schema = 'your_db';
低效复合索引
索引列顺序不当(如INDEX(created_at, user_id)
,但查询仅用user_id
)。
优化策略:按高频查询条件调整列顺序sql
DROP INDEX idx_old ON orders; CREATE INDEX idx_new ON orders(user_id, created_at); -- 高频字段前置
重复索引
功能重叠索引(如已有(A,B)
复合索引,又单独创建(A)
索引)。
检测工具:bash
pt-duplicate-key-checker --database=your_db # Percona 工具扫描
低选择性索引
在区分度低的列上创建索引(如性别、状态标志位)。
判定标准:sql
SELECT COUNT(DISTINCT gender)/COUNT(*) AS selectivity FROM users; -- 结果 <5% 建议删除
二、删除操作最佳实践
安全删除流程:
- 通过
EXPLAIN
验证索引使用情况; - 确认未被使用时备份索引 DDL;
- 执行删除并监控性能变化。
删除命令示例:
sql
-- 单次删除 DROP INDEX idx_redundant ON orders; -- 批量生成删除语句(MySQL) SELECT CONCAT('DROP INDEX ', index_name, ' ON ', table_name, ';') FROM information_schema.statistics WHERE index_name IN ('idx_old1','idx_old2');
三、性能收益与风险规避
优化项 | 典型收益 | 风险规避措施 |
---|---|---|
写入吞吐量 | 提升 40%(电商实测) | 核心交易链路索引需保留 |
存储空间 | 节省 15%-30% | 提前评估分区表依赖关系 |
锁争用 | 减少 30% 锁等待 | 避开业务高峰时段操作 |
四、关键注意事项
- 唯一索引与主键:删除可能破坏数据约束,需提前验证依赖关系;
- 分区表索引:删除分区后需重建关联索引,避免状态变为
UNUSABLE
; - 监控机制:删除后持续观察慢查询日志,防止误删有效索引。
索引维护如同修剪枝叶——精准去除枯枝,方能释放主干生长潜力。定期执行上述流程,可使数据库写入性能显著提升,存储效率同步优化。