MySQL忽略了我的索引

时间:2009-09-30 10:40:23

标签: mysql database indexing

我自己设置索引很新。我目前正在尝试使用它来发现它是如何工作的,以及在什么情况下数据库将使用索引。

我有一个包含3列的简单表格;身份证,姓名和身份。我在名称上设置了一个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

有人可以向我解释一下吗?

2 个答案:

答案 0 :(得分:3)

“使用索引”表示它使用索引作为“覆盖索引”。当它只需要访问索引以满足查询时就会发生这种情况。

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

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

答案 1 :(得分:1)

对于每个查询,“key”列表示“name” - 所以,我会说你的两个查询都使用了名为“name”的索引,这可能是在“name”列中 - 这就是您想要的(引用manual

  

键列表示密钥   MySQL实际决定的(索引)   使用。如果MySQL决定使用其中一个   要查找的possible_keys索引   行,该索引被列为键   值。

此外,您只需浏览“1”行,这是好的(没有全扫描或类似的东西)


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

  

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

     

ref可用于索引列   使用=或< =>进行比较   操作


而且“ref”列表示“const” - 不确定它究竟意味着什么,但据我所知,这是一件好事。

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

作为参考,有关更多信息:7.2.1. Optimizing Queries with EXPLAIN