这是一个执行时间大约为1毫秒的MySQL查询:
SELECT SQL_NO_CACHE DISTINCT invoice.*,
GROUP_CONCAT(DISTINCT line.guid) as line
FROM invoice
LEFT JOIN ligne ON line.invoice = invoice.guid
GROUP BY invoice.guid
WHERE acompte = 1
LIMIT 0, 100;
如果我在查询中添加ORDER BY invoice.date
,查询会变得非常缓慢,需要大约3秒才能完成。
如果我删除LEFT JOIN
(和GROUP_CONCAT
),则查询时间再次为1毫秒。
我添加了EXPLAIN
以查看当查询变慢时MySQL正在执行什么操作,我可以看到它正在使用一个临时文件:
1 SIMPLE invoice index NULL PRIMARY 4 NULL 25385 Using temporary; Using filesort
1 SIMPLE line ref invoice invoice 5 gestixi.invoice.guid 1 Using index
我确信有一种方法可以加速这个查询,但我找不到。 有什么想法吗?
请注意,我无法在“日期”上添加索引(顺便说一下,这没有改变任何内容),因为我希望我的用户能够对表中的每个字段进行排序。
另请注意,“invoice.guid”,“line.invoice”,“line.guid”和“acompte”都已经建立了索引。
编辑
如果我先执行一个没有LEFT JOIN但包含ORDER BY子句的查询以获取所需行的ID,然后再使用这些ID作为WHERE子句执行第二个查询(如上所述),则可以在不到10ms的时间内获得结果。
这使我相信必须有一种方法可以加速这个查询而无需添加索引。
invoice.date
上添加索引,因为如果这样做,我将不得不在表的所有字段上添加索引。无论如何,我尝试在其上添加索引,但它没有被使用(也没有改变任何东西)。 - Nicolas BADIAinvoice.date, invoice.guid
上创建复合索引,如果该索引未被使用,则尝试明确告诉查询优化器使用use index
。 - Meherzad