我自己设置索引很新。我目前正在尝试使用它来发现它是如何工作的,以及在什么情况下数据库将使用索引。
我有一个包含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
有人可以向我解释一下吗?
答案 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