为什么这个EXPLAIN中没有使用密钥?

时间:2016-09-09 20:57:41

标签: mysql

我希望此查询能够使用密钥。

mysql> DESCRIBE TABLE Foo;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| name  | varchar(50) | NO   | UNI | NULL    |                |
+-------+-------------+------+-----+---------+----------------+

mysql> EXPLAIN SELECT id FROM Foo WHERE name='foo';
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                                               |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | Impossible WHERE noticed after reading const tables |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+

Foo在name上有唯一索引,那么为什么SELECT中没有使用索引?

2 个答案:

答案 0 :(得分:2)

来自名为EXPLAIN Output Format的MySQL手册页:

  

不可能在阅读 const表后注意到了(JSON属性:   消息)

     

MySQL已经读取了所有const(和系统)表并注意到了WHERE   子句总是错误的。

和const表的定义,来自名为Constants and Constant Tables的页面:

  

MySQL常量不仅仅是查询中的文字。   它也可以是常量表的内容,定义为   如下:

     

一个零行或只有一行的表

     

使用WHERE条件限制的表表达式,   包含表单column = constant的表达式,用于所有   表格主键的列,或任何列的所有列   表格的唯一键(前提是唯一列也是如此)   定义为NOT NULL)。

第二个参考是一页半长。请参考它。

const

  

常量

     

该表最多有一个匹配的行,在行的开头读取   查询。因为只有一行,所以列中的值   优化器的其余部分可以将此行视为常量。   const表非常快,因为它们只读一次。

     比较PRIMARY KEY或UNIQUE的所有部分时使用

const   索引到常量值。在以下查询中,tbl_name可以是   用作const表:

     

SELECT * FROM tbl_name WHERE primary_key = 1;

     

SELECT * FROM tbl_name WHERE primary_key_part1 = 1 AND   primary_key_part2 = 2;

答案 1 :(得分:0)

It could be because that the said table Foo very less volume of data. In such case optimizer will choose to do table scan rather than looking through index.

As MySQL Documentation明确说明

  

索引对于小型表或大型表的查询不太重要   报表查询处理大多数或所有行的位置。当一个查询   需要访问大多数行,顺序读取比快   通过索引工作。顺序读取可以最大限度地减少磁盘搜索   如果不是查询所需的所有行。