【发布时间】:2013-07-26 12:30:59
【问题描述】:
运行此查询时:
SELECT
a.id,
pub.name AS publisher_name,
pc.name AS placement_name,
b.name AS banner_name,
a.lead_id,
a.partner_id,
a.type,
l.status,
s.correctness,
a.landing_page,
t.name AS tracker_name,
a.date_view,
a.date_action
FROM actions AS a
LEFT JOIN publishers AS pub ON a.publisher_id = pub.id
LEFT JOIN placements AS pc ON pc.publisher_id = pub.id
LEFT JOIN banners AS b ON b.campaign_id = a.campaign_id
LEFT JOIN leads l ON
l.lead_id = a.lead_id
AND l.created = (
SELECT MAX(created) from leads l2 where l2.lead_id = l.lead_id
)
LEFT JOIN statuses AS s ON l.status = s.status
LEFT JOIN trackers AS t ON t.id = a.tracker_id
LIMIT 10
我可以按actions 表中的每一列进行排序。但是,当我尝试例如ORDER BY b.name(来自banners 表,加入actions.banner_id)或ORDER BY l.lead_id(在更复杂的条件下从leads 加入时,如上所示)MySQL 正在运行查询很长时间(大多数表都有数万条记录)。在性能方面是否可以按连接列排序?
【问题讨论】:
-
您可以通过添加 where 子句来提高性能,这样您就不会尝试对尽可能多的记录进行排序。
-
@DanBracuk,我认为在这种情况下这是不可能的 - 我想在这里对结果进行排序,而不是过滤它们。
-
我猜你在应用连接的所有字段中都有索引。也可以试试命令
explain看看查询是如何运行的。 -
我的猜测(这只是一个猜测)是您的相关子查询正在减慢速度。您知道如何将其重写为不相关的子查询吗?此外,没有 ORDER BY(或者可能是 GROUP BY)的 LIMIT 是毫无意义的。
-
我不明白您为什么要进行左连接,然后按连接列排序?如果您按列排序,您实际上希望在其中包含一个值。
标签: mysql sql join sql-order-by