Shuo
Shuo I'm a DBA(Database Administrator), we can share and discuss MySQL, MongoDB, Redis and other databases here, also including learning Python, Shell, Golang together.

怎么查找MySQL中的重复索引和无用索引,并且安全地drop index删除索引?


怎么查找MySQL中的重复索引和无用索引,并且安全地drop index删除索引?

好文分享

Dropping useless MySQL indexes

总结

重复索引查找方法:

可以使用pt-duplicate-key-checker查找出MySQL数据库中的重复索引。
注意事项:
1. 重复索引有部分是业务需要的,用以做冗余,或者是完成覆盖索引的sql,不能简单的找到重复索引后进行删除

无用索引查找方法:

  1. 对于MariaDB或者Percona Server for MySQL,可以使用user_statistics,查询information_schema.INDEX_STATISTICS,可以找到未被使用的索引(ps.可以查看我之前的文章MySQL索引统计信息information_schema.INDEX_STATISTICS
  2. 对于官方版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。

注意事项:

  1. 打开performance_schema统计对系统性能有一定影响
  2. MariaDB10默认为关闭performance_schema
  3. 此种统计方法是不准确的,因为其是把未产生IO等待的索引,看作为未被使用的索引。

删除索引

由于对于索引的下线具有业务风险,所以,MySQL8开始,支持索引不可见,语法为:

1
2
ALTER TABLE t ALTER INDEX idx_a INVISIBLE[VISIBLE];

并且该语句可以瞬间完成,以此降低drop index的风险。

comments powered by Disqus