2013-07-26 105 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