首页 文章

MySQL忽略了我的索引

提问于
浏览
2

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

我有一个简单的表,有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 回答

  • 3

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

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

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

  • 1

    对于每个查询,“ key " columns indicates " name " -- so, I'd say your two queries both used the index called " name ", which probably is on the " name ”列 - 这就是您想要的(引用manual):

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

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

    type " says " ref”,这似乎是一件好事:

    对于上一个表中的每个行组合,将从此表中读取所有具有匹配索引值的行 . ...如果使用的密钥只匹配几行,这是一个很好的连接类型 . ref可用于使用=或<=>运算符进行比较的索引列 .

    和“ ref " column indicates " const ” - 不确定它究竟意味着什么,但据我所知,这是一件好事 .

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

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

相关问题