2012-10-25 82 views
0

我已經採取了一個大項目,並作爲數據庫變大,一些代碼停止工作,轉換子查詢連接性能

這裏是找到那些rendering_requests誰是最後rending_logpending查詢,有時候有沒有狀態變化的記錄條目,記錄爲noaction,我們不需要統計它們。這是我從查詢中理解的。

SELECT 
    COUNT(rr.rendering_id) AS recordCount 
FROM 
    rendering_request rr, rendering_log rl 
WHERE 
    rl.rendering_id = rr.rendering_id 
AND rl.status = 'pending' AND 
    rl.log_id = (
      SELECT rl1.log_id 
      FROM rendering_log rl1 
      WHERE 
      rl.rendering_id = rl1.rendering_id AND 
      rl1.status = 'pending' 
      AND rl1.log_id = (
       SELECT rl2.log_id 
       FROM rendering_log rl2 
       WHERE rl1.rendering_id = rl2.rendering_id AND rl2.status!='noaction' 
       ORDER BY rl2.log_id DESC LIMIT 1 
        ) 
      ORDER BY rl1.log_id DESC 
      LIMIT 1 
      ) 

例如

rendering_id=1由具有多個日誌

status=noaction 
status=noaction 
status=pending 

rendering_id=2由具有多個日誌

status=noaction 
status=assigned 
status=noaction 
status=pending 

當我們運行這個查詢時,它應該顯示count=1,因爲只有rendering_id=1是我們想要的記錄。

眼下該查詢已停止工作,並掛在MySQL服務器

回答

1

不是100%肯定我有這個權利,但這樣的事情。想想你仍然需要使用幾個子查詢,但(這取決於MySQL版本)做這種方式使用連接應該是快了很多

SELECT COUNT(rr.rendering_id) AS recordCount 
FROM rendering_request rr 
INNER JOIN rendering_log rl 
ON rl.rendering_id = rr.rendering_id 
INNER JOIN (SELECT rendering_id, MAX(log_id) FROM rendering_log WHERE status = 'pending' GROUP BY rendering_id) rl1 
ON rl1.rendering_id = rl.rendering_id 
AND rl1.log_id = rl.log_id 
INNER JOIN (SELECT rendering_id, MAX(log_id) FROM rendering_log WHERE status!='noaction' GROUP BY rendering_id) rl2 
ON rl2.rendering_id = rl1.rendering_id 
AND rl2.log_id = rl1.log_id 
WHERE rl.status = 'pending' 
+0

嗯,謝謝你的提示,我試圖運行。現在它給我'[Err] 1054 - 'on子句'中的未知列'rl1.log_id' –

+0

:)好吧我做到了,我已經將子查詢部分'... MAX(log_id)更新爲log_id。 ..'並且它返回了我2236個結果以1秒爲單位。我仍然不確定這個數字是否正確。 –