我对我运行的一个常见查询运行了 EXPLAIN 语句,我很好奇为什么我的“possible_keys”只匹配我索引字段的 2/3。这是因为我使用了 LIKE 子句吗?
这是我的 MySQL 控制台图像的链接,显示了我解释的查询和索引。 http://i.imgur.com/RCWb0to.png?1
如果您注意到我的索引中只有 2 个出现在 possible_keys 列中。
此外,为什么我的“关键”列显示 NULL? 我非常想更好地理解这一点,如果有好的资源可供我更详细地阅读,我将不胜感激提供链接和一些输入!
最佳答案
Possible_keys
只考虑可能与当前查询相关的索引。表中当然可能还有其他索引,即使它们对此查询没有任何帮助。
MySQL 会考虑列中值的频率,并且可能会决定不使用索引,因为您要搜索的值无助于缩小行集的范围。
以此类推,如果你看一本书后面的索引,你不会在索引中看到“the”这个词。它只会列出书中的每个页码,这毫无意义。在这种情况下没有理由使用索引,使用索引实际上会使搜索变慢。
同样,您正在搜索术语 empl_id=86560 AND week_number=22
,但这些特定值在您的表中可能非常常见,以至于 MySQL 决定读取每一行并丢弃更经济那些不匹配
术语deduction_code LIKE '%VIS%'
不能使用索引。以此类推,搜索电话簿,找到某人名字中间带有“VIS”的每个名字。这本书已排序这一事实无济于事,您仍然必须从头到尾地搜索它。
您的 key
列为 NULL,因为查询决定对此查询不使用索引。另一个线索是 type
列显示“ALL”,这意味着它正在进行表扫描,读取表中的每一行。
参见 http://dev.mysql.com/doc/refman/5.6/en/explain-output.html#explain-join-types
您可能对我的介绍感兴趣,How to Design Indexes, Really .
关于MySQL 索引和 possible_keys,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17624041/