2010-04-05 71 views
3
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奇怪在MySQL中使用


但是,当我点不到在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


问题是什么?

回答

6

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

的“How MySQL Uses Indexes”手册页提供了这种片段信息的:

有时MySQL不使用索引,即使 一个是可用的。一个 出现这种情况的情况 是当优化程序估计使用索引的 将要求MySQL访问表中非常大比例的 行时。 (在这种情况下, 表扫描可能是因为它需要较少的目的要快得多 。)

因为WHERE相比,表大小条款是比较大的在你的第一个ID的数量,MySQL有确定扫描数据比查阅索引要快,因为数据扫描可能会导致磁盘访问时间缩短。

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