2013-07-26 68 views
1

在运行此查询:排序结果从加入

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正在查询一个冗余时间(大多数表有数万个记录)。性能方面,是否可以通过连接列进行排序?

+0

您可以通过添加where子句来提高性能,这样您就不会尝试对很多记录进行排序。 –

+0

@DanBracuk,在这种情况下我不认为这是可能的 - 我想在这里排序结果,而不是过滤它们。 – acid

+1

我想你有你申请加入的所有领域的索引。也可以尝试命令'explain'来查看查询是如何运行的。 – jcho360

回答

0

您可以先在子查询中过滤(按顺序,位置等)您的记录,然后将结果与其余表格结合起来。

1

您应该在表中要对其进行排序的列上使用内部联接重写查询。

例如,如果您排序上actions.banner_id

SELECT ... 
FROM actions AS a 
    JOIN banners AS b ON b.campaign_id = a.campaign_id 
    LEFT JOIN *rest of the query* 

你会得到相同的结果,除非没有足够的横幅可以加入到行动,共产生10行。

我猜这不是这种情况,否则你不会在banner_id上排序。

+0

我不知道这是否会有所帮助。仍然 - 我试了一下,得到了同样的结果 - 做取消“查询运行”。 – acid

+0

在列上是否有索引? – Nicolas

+0

是的,有一个。 – acid