2014-01-15 82 views
0

我正在運行此查詢,但它非常緩慢。在最後一個左連接or子句是什麼停滯不前下來,但我想不出另一種方式來構造查詢,以獲得結果我在尋找:我該如何優化這個mysql select + multiple joins查詢?

SELECT *, 
     DATE_FORMAT(tbl1.pub, '%m/%d/%Y') AS pub_a, 
     CONCAT(tbl1.code1, tbl1.code2) AS code_a 
FROM (tbl1 
     INNER JOIN tbl2 ON tbl1.pkid=tbl2.fkid 
     LEFT JOIN tbl3 ON tbl1.pkid=tbl3.fkid) 
LEFT JOIN tbl4 ON tbl1.person=tbl4.code OR tbl3.person=tbl4.code 
WHERE tbl1.subcat != '' 
    AND tbl1.pub < '2014-01-15 13:20:23' 
    AND tbl1.exp > '2014-01-15 13:20:23' 
ORDER BY tbl1.pub DESC 
LIMIT 0, 50 
+1

我們真正喜歡的是當你把它全部寫在這樣的一行上。 – Strawberry

+0

我個人喜歡搞清楚'CREATE TABLE'模式和'SHOW INDEXES FROM'。 – bishop

回答

1

這是一個長期的射門,但嘗試改變

left join tbl4 on tbl1.person = tbl4.code 
    or tbl3.person = tbl4.code 

left join tbl4 on tbl4.code in (tbl1.person, tbl3.person) 
+0

謝謝,這加快了一點。 – user3200064

2

不幸的是,在on條款優化or是不容易的。你可以把它分成兩個查詢,加上一個union

select * 
from ((SELECT *, 
       DATE_FORMAT(tbl1.pub, '%m/%d/%Y') AS pub_a, 
       CONCAT(tbl1.code1, tbl1.code2) AS code_a 
     FROM (tbl1 
       INNER JOIN tbl2 ON tbl1.pkid=tbl2.fkid 
       LEFT JOIN tbl3 ON tbl1.pkid=tbl3.fkid 
      ) 
       LEFT JOIN tbl4 ON tbl3.person=tbl4.code 
     WHERE tbl1.subcat != '' 
      AND tbl1.pub < '2014-01-15 13:20:23' 
      AND tbl1.exp > '2014-01-15 13:20:23' 
     ORDER BY tbl1.pub DESC 
     LIMIT 0, 50 
     ) union 
     (SELECT *, 
       DATE_FORMAT(tbl1.pub, '%m/%d/%Y') AS pub_a, 
       CONCAT(tbl1.code1, tbl1.code2) AS code_a 
     FROM (tbl1 
       INNER JOIN tbl2 ON tbl1.pkid=tbl2.fkid 
       LEFT JOIN tbl3 ON tbl1.pkid=tbl3.fkid 
      ) 
       LEFT JOIN tbl4 ON tbl1.person=tbl4.code 
     WHERE tbl1.subcat != '' 
      AND tbl1.pub < '2014-01-15 13:20:23' 
      AND tbl1.exp > '2014-01-15 13:20:23' 
     ORDER BY tbl1.pub DESC 
     LIMIT 0, 50 
     ) 
    ) t 
order by pub desc 
limit 0, 50