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
有什么问题?
答案 0 :(得分:6)
MySQL优化器做出了许多有时看起来很奇怪的决定。在这种特殊情况下,我相信你有一个非常小的表(从第一个EXPLAIN的外观总共188行),这影响了优化器的决定。
“How MySQL Uses Indexes”手册页提供了以下信息片段:
有时MySQL不使用索引, 即使有一个可用。一 发生这种情况的情况 是优化器估计的时候 使用索引需要MySQL 访问很大比例的 表中的行。 (在这种情况下,a 表扫描可能要快得多 因为它需要较少的搜索。)
由于第一个WHERE子句中的ID数量与表大小相比相对较大,因此MySQL确定扫描数据比查询索引更快,因为数据扫描可能导致磁盘更少访问时间。
您可以通过向表中添加行并重新运行第一个EXPLAIN查询来对此进行测试。在某个时刻,MySQL将开始使用它的索引以及第二个查询。