2012-09-13 137 views
1

我想了解优化和索引的一些内容,因为我运行了需要4分钟才能完成的插入选择查询。现在,我添加了多个索引,它似乎让我的查询在0.160秒内运行。现在我想知道的是,为什么客户表在使用订单表中的orderdate命令时正在使用filesort消息。查询和解释:MySQL查询优化 - 按索引排序

enter image description here

我甚至试过在O(单)(订购日期,订单ID)和(订购日期,订单ID,客户ID)的索引。我以为其中一个会帮助,但没有骰子。任何人都可以帮我理解为什么?

+0

这是非常不可能的,你可以在这个特定的查询中优化'ORDER BY'。 PS:**总是**把'SHOW CREATE TABLE'放在关于优化 – zerkms

+0

kk的问题上。任何原因为什么不可能?(我想学习:))。 NeXT应该包括什么时间? SHOW CREATE TABLE用于所有使用的表或者是ex。进口订单是最重要的吗? –

+0

这不太可能,因为你的“主”表(在'FROM'中使用的那个)是'products P',而你正在按另一个表'orders o'的列进行排序。 PS:为了确保您创建了正确的索引,我们需要知道当前表结构 – zerkms

回答

1

使用“filesort”进行查询没有任何问题;所有这一切意味着结果不能根据索引进行排序。

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

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

由于查询结果是从该查询中获取的,因此将结果放入临时表中,以便稍后对其进行排序。

添加初始索引很可能会加快您的查询速度,因为MySQL最初正在执行全表扫描以获取结果,这非常耗时。一旦添加了合适的索引,查找记录就非常快捷。它最初可能不得不在临时表上创建一个文件夹,但这可能不会比现在更慢或更快。

如果您尝试移动订单表的联接,并将其放在产品表的联接之前,则可以消除临时表和文件排序的使用。

检查出what does using filesort mean?How MySQL Uses Internal Temporary Tables欲知更多信息。

+0

ohh。我不认为连接顺序很重要,只要我有正确的值来比较NeXT连接。我会试试这个。现在不是来自(进口订单)的“主表”吗?为什么它是第一次加入,或者是从表中“第一次加入”?编辑:移动连接顺序是非成功的。但正如你所说,这可能不是很耗时 –

+1

可能值得一提的是,“随意添加更多索引”并不是一个好主意。您添加**的每个索引显着**会减慢插入和更新并占用磁盘空间。 – Nim

+0

我想弄清楚是什么让一个好的指数。因此,在我发现我的两个最糟糕的查询(提取订单和订单)正在使用哪些索引后,我删除了未使用的索引:) –