我正在尝试了解有关优化和索引的内容,因为我运行了一个需要4分钟才能完成的插入选择查询。现在,我添加了多个索引,它似乎使我的查询在0.160秒内运行。现在我想知道为什么当我在订单表中通过orderdate订购时,customer表正在获取使用filesort消息。查询和解释:
我甚至在O(Orders)中为(orderdate,orderid)和(orderdate,orderid,customerid)尝试了一个索引。我以为其中一个会有所帮助,但没有骰子。谁能帮我理解为什么?
答案 0 :(得分:1)
使用“filesort”查询没有错;所有这些意味着结果无法根据索引进行排序。
现在,在这种情况下,无法对索引执行排序的原因是因为ORDER BY
包含连接队列中第一个表以外的表中的列。
由于您的查询结果不包含很多行,因此正在使用的临时表可能在内存中。
当从该查询中获取查询结果时,会发生的结果是将结果放入临时表中,以便稍后对其进行排序。
添加初始索引最有可能加快查询速度,因为MySQL正在进行全表扫描,以便最初获取结果,这非常耗时。添加正确的索引后,查找记录非常快。它可能最初必须在临时表上执行一个文件排序,但这可能不会比现在更慢或更快。
如果您尝试移动Orders表的连接并将其放在Products表的连接之前,则可以省去临时表和文件排序的使用。
查看what does using filesort mean?和How MySQL Uses Internal Temporary Tables了解详情。