MySQL 索引和 possible_keys

标签 mysql indexing key

我对我运行的一个常见查询运行了 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/

相关文章:

php - 我想按条件删除数据。如果数据在另一个表中作为外键可用,则不要删除它

MySQL Group By 按顺序过滤结果

python - 从系列中获取索引和值

mysql外键插入

c++ - 无需重新创建匹配 map

ruby - 高效的 Ruby 代码,用于为单词中唯一的每个单词找到最短的前缀

javascript - 从 Node.js 更新 MySQL - 如何判断零行是否受到影响?

MySQL - 请帮助修复查询中的错误

performance - 使用Elasticsearch作为时间窗口存储的性能问题

matlab - 寻找矩阵中的临界点