4

我正在尝试调整我的 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 |
+----+-------------+-------+-------+---------------+------+---------+------+--------+-----------------------------+
4

3 回答 3

1

不同之处在于,在第一种情况下,MySQL 将创建一个包含 165000 行的临时表,并在没有索引的情况下对它们进行排序。即使价格列上有索引,也不能用于排序。

您的小表可能能够使用索引进行排序,因此速度要快得多。

于 2013-02-13T12:18:23.247 回答
0

您可以使用 EXPLAIN 语句来检查查询的瓶颈http://dev.mysql.com/doc/refman/5.0/en/explain.htmlhttp://dev.mysql.com/doc/refman/5.0/ zh/优化.html

于 2013-02-13T10:44:04.737 回答
0

这可能是由于几个问题。

挑剔点 - 在大表中,您所做的不仅仅是简单的排序,而是首先查找记录,然后进行排序。在您没有按 depature_time 搜索的小桌子上。但这有点作弊,因为表较大,为了知道使用哪个n,它首先必须构建表。如果它被编入索引,那么它不太可能像您的测试显示的那样重要。它仍然花费了 0.5 秒中的 0.1 秒。也可以在小桌子上尝试 where 子句,应该会花费更多时间。如果没有,那么它指向:

第二,*缓存未命中 *

在您使用的机器上,2,000K 记录可能远远超过 150K 记录,除非您有一个专门用于 mysql 的盒子,从而增加了缓存未命中的可能性。即使您将 ^2 排序或更差的记录加载到内存中并且内存对齐,这些未命中可能会造成更大的损失。如果你在一个有很多内存的盒子上运行这些测试,假设所有其他条件都相同,那么差异应该会更小。

于 2013-02-13T13:51:20.643 回答