1

我正在尝试学习一些关于优化和索引的知识,因为我运行了一个需要 4 分钟才能完成的插入选择查询。现在,我添加了多个索引,它似乎使我的查询在 0.160 秒内运行。现在我想知道的是,当我在我的订单表中按 orderdate 订购时,为什么客户表会收到 using filesort 消息。查询和解释:

在此处输入图像描述

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

4

1 回答 1

1

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

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

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

当从该查询中获取查询结果时,发生的情况是结果被放入一个临时表中,以便以后可以对它们进行排序。

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

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

看看使用文件排序是什么意思?以及MySQL 如何使用内部临时表以获取更多信息。

于 2012-09-13T21:06:46.090 回答