在Mysql中使用索引奇怪

时间:2010-04-05 07:33:38

标签: sql mysql indexing

Explain
SELECT `feed_objects`.*
FROM `feed_objects`
WHERE (`feed_objects`.feed_id IN
  ( 165,160,159,158,157,153,152,151,150,149,148,147,129,128,127,126,125,124,122,
    121, 120,119,118,117,116,115,114,113,111,110)) ;

+----+-------------+--------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table        | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+--------------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | feed_objects | ALL  | by_feed_id    | NULL | NULL    | NULL |  188 | Using where |
+----+-------------+--------------+------+---------------+------+---------+------+------+-------------+

未使用索引by_feed_id


但是当我指向的时间少于WHERE中的值时 - 一切正常

Explain
SELECT `feed_objects`.*
FROM `feed_objects`
WHERE (`feed_objects`.feed_id IN
  (165,160,159,158,157,153,152,151,150,149,148,147,129,128,127,125,124)) ;

+----+-------------+--------------+-------+---------------+------------+---------+------+------+-------------+
| id | select_type | table        | type  | possible_keys | key        | key_len | ref  | rows | Extra       |
+----+-------------+--------------+-------+---------------+------------+---------+------+------+-------------+
|  1 | SIMPLE      | feed_objects | range | by_feed_id    | by_feed_id | 9       | NULL |   18 | Using where |
+----+-------------+--------------+-------+---------------+------------+---------+------+------+-------------+

使用的索引by_feed_id


有什么问题?

1 个答案:

答案 0 :(得分:6)

MySQL优化器做出了许多有时看起来很奇怪的决定。在这种特殊情况下,我相信你有一个非常小的表(从第一个EXPLAIN的外观总共188行),这影响了优化器的决定。

How MySQL Uses Indexes”手册页提供了以下信息片段:

  

有时MySQL不使用索引,   即使有一个可用。一   发生这种情况的情况   是优化器估计的时候   使用索引需要MySQL   访问很大比例的   表中的行。 (在这种情况下,a   表扫描可能要快得多   因为它需要较少的搜索。)

由于第一个WHERE子句中的ID数量与表大小相比相对较大,因此MySQL确定扫描数据比查询索引更快,因为数据扫描可能导致磁盘更少访问时间。

您可以通过向表中添加行并重新运行第一个EXPLAIN查询来对此进行测试。在某个时刻,MySQL将开始使用它的索引以及第二个查询。