我正在尝试调整我的 MySQL 查询的性能,但遇到了一个我不理解的问题(因此无法修复)。本质上,如果它们在自己的表中,它可以更快地对 165,000 行进行排序,而不是它们是更大表的子集。
表 fl6 有 200 万行。它在 (departure_out) 上有一个索引 x1。离开_out 是一个日期类型。
以下选择查找 165,916 行。它需要 0.1 秒。
select count(*)
from fl6
where departure_out > "2013-04-01"
and departure_out < "2013-04-05";
以下 select 具有相同的 where 子句,但按价格排序。它需要 0.5 秒。0.4 秒对 165,000 行进行排序。
select id
from fl6
where departure_out > "2013-04-01"
and departure_out < "2013-04-05"
order by price_total limit 1;
我想看看它是否可以更快,所以我创建了一个只包含 165,916 行的小表。然后我做了那种。耗时 0.16 秒。
select id
from fl6_small
order by price_total limit 1;
因此,它可以相当快地对 165,000 行进行排序,但如果它是更大表的子集,则需要两倍以上的时间?我如何让它做到这一点?为什么有区别?
几件事:我已经尝试在 (price) 和 (departure_out, price) 上放置一个索引。这没什么区别。无论如何,如果在 fl6_small 中的搜索显示即使没有它也能以多快的速度排序,则不需要索引。
编辑:
(编辑了上面的一些行数和时间以匹配用于解释计划的表格)
解释计划:
+----+-------------+-------+-------+---------------+------+---------+------+--------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+------+---------+------+--------+-----------------------------+
| 1 | SIMPLE | fl6 | range | x1 | x1 | 3 | NULL | 160493 | Using where; Using filesort |
+----+-------------+-------+-------+---------------+------+---------+------+--------+-----------------------------+