【发布时间】:2016-08-30 07:20:02
【问题描述】:
我注意到我在一个相当大的表上执行的某个查询在服务器处于高负载下时变得非常慢:
SELECT large.*, users.username
FROM large
LEFT JOIN users ON large.user_id = users.id
ORDER BY large.abc
LIMIT 30
(large.user_id 和 users.id 都已编入索引。)
因此,经过进一步检查,我意识到这是由于连接查询造成的,因为删除连接查询使其变得即时。此外,重写查询也一样快。
SELECT t.*, users.username
FROM (
SELECT * FROM large ORDER BY large.abc LIMIT 30
) as t
LEFT JOIN users ON t.user_id = users.id
这是什么原因?第一个查询是否在排序和限制之前连接所有行,并且是解决此问题以使用第二个查询的最佳/唯一方法?
【问题讨论】:
-
你的第一个查询甚至不应该运行,因为它的语法错误
-
就像@TinTran 所说,语法是错误的。您在加入之前订购。
-
@TinTran 我的错误,已修复
-
large和users是什么关系?多对多还是一对多还是多对一还是一对一? -
我之所以问,是因为我猜如果 order by 有更多行要处理,它会更慢。在第二个查询中,您在加入之前将其限制为 30 行。跨度>