MySQL忽略我的索引

我很自己设定索引。 目前我只是试验它来发现它是如何工作的,以及在哪些情况下数据库将使用索引。

我有一个简单的3列表格; 一个id,一个名字和一个状态。 我已经为CHAR(30)列的名称设置了一个索引。 根据我的预期,MySQL会在下面的查询中忽略这个索引:

SELECT * FROM people WHERE name = 'Peter'
id  select_type  table   type  possible_keys  key   key_len  ref    rows  Extra

1   SIMPLE       people  ref   name           name  90       const  1     Using where

但是,在使用以下查询时,将使用索引:

SELECT COUNT(*) FROM people WHERE name = 'Peter'
id  select_type  table   type  possible_keys  key   key_len  ref     rows  Extra

1   SIMPLE       people  ref   name           name  90       const   1     Using where; Using index

任何人都可以向我解释这个吗?


“使用指数”意味着它将指数用作“覆盖指数”。 当只需要访问索引以满足查询时,就会发生这种情况。

另一方面,如果“使用索引”不存在,但在“密钥”列中,该索引被命名,那么它按照“ref”列中描述的方式使用该索引。

所以在这两种情况下它都使用索引,但只有COUNT()将它用作覆盖索引。


对于每个查询,“ key ”列都显示“ name ” - 所以,我会说你的两个查询都使用名为“ name ”的索引,这可能在“ name ”列 - 这就是你想要的(引用手册):

关键字列表示MySQL实际决定使用的关键字(索引)。 如果MySQL决定使用其中一个possible_keys索引来查找行,那么该索引将被列为关键值。

此外,你只是通过“ 1 ”行,这是很好的(没有全面扫描或类似的东西)。


type ”表示“ ref ”,这似乎是一件好事:

从该表中读取具有匹配索引值的所有行,用于来自先前表的各行的组合。 ... 如果使用的密钥只匹配几行,这是一个很好的连接类型

ref可以用于使用=或<=>运算符进行比较的索引列。


并且“ ref ”列表示“ const ” - 不确定它的意思,但据我所知,这是一件好事。

是什么让你认为你的索引不用于一列?

作为参考,更多信息:7.2.1。 使用EXPLAIN优化查询

链接地址: http://www.djcxy.com/p/25073.html

上一篇: MySQL ignores my index

下一篇: TIMESTAMP vs. DATETIME MySQL