我在MySQL中有一个包含7个索引的表,其中大多数都在多个列上。我认为这里索引太多了。是否有任何方法可以获取对数据库的所有数千个查询使用更多索引的统计信息以及不值得的内容,以便我知道要在第一时间考虑删除哪个索引?
答案 0 :(得分:3)
您可以尝试确定which indexes are used at all.
然而,就有用性列表而言,抱歉,没有内置的方法可以做到这一点,我认为查询分析器甚至不这样做。
您似乎可能需要进行审核以确定正在使用的影响该表的查询,并对它们进行解释以查看它们是否使用了您的任何索引。
有一个错误报告requesting this feature。
答案 1 :(得分:1)
您应该查看Percona补丁或其服务器版本。他们已将表添加到INFORMATION_SCHEMA,以便您可以找到未使用的索引。
链接:
答案 2 :(得分:0)
这不是一种特定的方法,但你可能会说。试试EXPLAIN SELECT...
它会显示正在使用的表格,行数等等。这应该可以为您提供足够的数据来加速您的表格
答案 3 :(得分:0)
在生产中启用常规查询日志记录。是的,我知道这很痛苦,我知道它会影响你的生产服务器,但是BITE THE BULLET。稍后会有用。如果可能的话,让它无限期地打开(当然确保日志轮换,压缩和到期工作并且肯定监视磁盘空间使用情况;如果发生坏事,请告诉Ops如何关闭它)
然后你可以开始使用像mk-query-digest这样的工具,它会在你的所有查询上运行EXPLAIN(当然,这是针对非生产数据库执行的,但是使用最近的生产数据库转储)。 / p>
这将使您能够分辨使用哪些索引以及使用频率。至少,如果EXPLAIN没有说谎,并且您的测试服务器使用与生产相同的计划。
或者至少,它主要是。 EXPLAIN尚未告诉您DELETE,UPDATE查询的工作原理。