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