mysql查询优化 - 按+索引排序

时间:2012-09-13 20:45:52

标签: mysql indexing query-optimization

我正在尝试了解有关优化和索引的内容,因为我运行了一个需要4分钟才能完成的插入选择查询。现在,我添加了多个索引,它似乎使我的查询在0.160秒内运行。现在我想知道为什么当我在订单表中通过orderdate订购时,customer表正在获取使用filesort消息。查询和解释:

enter image description here

我甚至在O(Orders)中为(orderdate,orderid)和(orderdate,orderid,customerid)尝试了一个索引。我以为其中一个会有所帮助,但没有骰子。谁能帮我理解为什么?

1 个答案:

答案 0 :(得分:1)

使用“filesort”查询没有错;所有这些意味着结果无法根据索引进行排序。

现在,在这种情况下,无法对索引执行排序的原因是因为ORDER BY包含连接队列中第一个表以外的表中的列。

由于您的查询结果不包含很多行,因此正在使用的临时表可能在内存中。

当从该查询中获取查询结果时,会发生的结果是将结果放入临时表中,以便稍后对其进行排序。

添加初始索引最有可能加快查询速度,因为MySQL正在进行全表扫描,以便最初获取结果,这非常耗时。添加正确的索引后,查找记录非常快。它可能最初必须在临时表上执行一个文件排序,但这可能不会比现在更慢或更快。

如果您尝试移动Orders表的连接并将其放在Products表的连接之前,则可以省去临时表和文件排序的使用。

查看what does using filesort mean?How MySQL Uses Internal Temporary Tables了解详情。