这是一个大约需要 1ms 才能完成的 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
我确定有一种方法可以加快查询速度,但我找不到。任何想法 ?
请注意,我不能在其上添加索引date
(顺便说一下,它不会改变任何东西),因为我希望我的用户能够对表的每个字段进行排序。
另请注意invoice.guid
,line.invoice
、line.guid
和acompte
已编入索引。
编辑
如果我在没有 LEFT JOIN 但使用 ORDER BY 子句的情况下进行第一次查询以获取我想要的行的 id,然后在 WHERE 子句中使用这些 id 进行第二次查询(如上面的查询),我可以得到我想要的需要在不到 10 毫秒。
这让我相信它必须是一种在不添加索引的情况下加速查询的方法。