2010-04-05 25 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將開始使用它的索引以及第二個查詢。