怎么查找MySQL中的重复索引和无用索引,并且安全地drop index删除索引?
好文分享
Dropping useless MySQL indexes
总结
重复索引查找方法:
可以使用pt-duplicate-key-checker查找出MySQL数据库中的重复索引。
注意事项:
1. 重复索引有部分是业务需要的,用以做冗余,或者是完成覆盖索引的sql,不能简单的找到重复索引后进行删除
无用索引查找方法:
- 对于MariaDB或者Percona Server for MySQL,可以使用user_statistics,查询information_schema.INDEX_STATISTICS,可以找到未被使用的索引(ps.可以查看我之前的文章MySQL索引统计信息information_schema.INDEX_STATISTICS)
- 对于官方版MySQL,可以使用Performance_schema中的table_io_waits_summary_by_index_usage表进行查找:
1
2
3
4
5
SELECT object_schema, object_name, index_name
FROM performance_schema.table_io_waits_summary_by_index_usage
WHERE index_name IS NOT NULL AND count_star = 0
ORDER BY object_schema, object_name, index_name;
注:需启动实例前设置performance_schema = on。
注意事项:
- 打开performance_schema统计对系统性能有一定影响
- MariaDB10默认为关闭performance_schema
- 此种统计方法是不准确的,因为其是把未产生IO等待的索引,看作为未被使用的索引。
删除索引
由于对于索引的下线具有业务风险,所以,MySQL8开始,支持索引不可见,语法为:
1
2
ALTER TABLE t ALTER INDEX idx_a INVISIBLE[VISIBLE];
并且该语句可以瞬间完成,以此降低drop index的风险。