如何检测是否需要MySQL索引?

snh*_*_nl 2 mysql indexing

如何检测是否需要MySQL索引?

我们的想法是可以改善某些查询。而且我知道我可以潜入缓慢的查询日志中...但是我在下面的文章中搜索了MS SQL,想知道是否有一种简单的方法可以分析是否需要索引(并将立即提高速度)。当前的MySQL数据库。

感谢帮助

MS SQL的资源:https//dba.stackexchange.com/questions/56/how-to-determine-if-an-index-is-required-or-necessary

Ric*_*mes 6

你不能

有办法来检测,过了一段时间,指数是否被使用。但是无法确定没有使用索引。假设您有一个每月执行一次的任务,该任务需要对表进行一些重要维护。而且,您确实需要一定的索引,以防止任务锁定表并关闭应用程序。如果您检查了当月大部分时间的索引使用情况,但未能包括该使用情况,则可能会决定不需要该索引。然后,您将删除索引...,并感到抱歉。(这是一个真实的轶事。)

同时,关于索引有一些简化的规则...

  • INDEX(a)如果您也有,则不需要INDEX(a,b)
  • INDEX(id)如果您也有PRIMARY KEY(id)或,则不需要UNIQUE(id)
  • 可以使用具有5列或更多列的索引,但不太可能是“有用的”。(缩水)
  • INDEX(a), INDEX(b)一样的INDEX(a,b)
  • INDEX(b,a)一样的INDEX(a,b); 您可能同时需要。
  • INDEX(flag),其中flag只有少量不同的值,可能永远不会使用-优化器将改为扫描表。
  • 在许多情况下,“前缀”索引(INDEX(foo(10)))是无用的。(但是有很多例外。)
  • “我索引了每一列” –一种不良的设计模式。
  • 通常但并非总是如此,同时拥有a PRIMARY KEYUNIQUEkey意味着某些东西不是最优的。
  • InnoDB表确实应该有一个显式的PRIMARY KEY
  • InnoDB将PK隐式包含在任何辅助密钥中。因此,考虑到PRIMARY KEY(id)INDEX(foo)是真的INDEX(foo, id)
  • 有时,优化程序会忽略该WHERE子句,并使用的索引ORDER BY
  • 某些查询具有偏斜的属性,因此优化器将根据不同的常量使用不同的索引。(我实际上为一个查询看到多达6个不同的解释计划。)
  • “索引合并相交”几乎总是不如复合索引好。
  • 这些提示中的大多数都有例外。

因此,我更喜欢采用所有查询(SELECTsUPDATEsDELETEs),为每个查询确定最佳索引,消除冗余等,以便找到“最佳”索引集。在给定SELECT的情况下,请参阅我的食谱来创建索引