2014-02-09 44 views
0

我想優化以下查詢,因爲它需要很長時間才能執行。任何人都可以提供關於如何優化這個建議,並且他們可以推薦任何索引來加速它。作爲說明,edata表包含大約100萬行,ddata表大約有1500萬行。有來自DDATA選擇,如果你運行查詢約5000項如何優化大型表的MySQL查詢

SELECT * FROM ddata WHERE DATE(startDate) = DATE(NOW()); 

,我試圖優化的查詢是:

SELECT e.ID,e.uID,e.sID 
FROM edata e 
LEFT JOIN ddata d ON e.sID=d.sID 
WHERE DATE(d.startDate)=DATE(NOW()); 

感謝

+0

索引的基本經驗法則:在比較操作中使用的任何字段都應該有一個索引。那就是你的'where','join',有時'order'子句中使用的任何東西。請注意,如果您在比較中使用該字段的DERIVED值,就像使用DATE()調用一樣,在字段上使用索引是沒有用的。 'startDate'可能被索引,但是'md5(somefield)'會強制執行表掃描。 –

+0

可能作爲旁白,使用NOW()意味着查詢不會進入查詢緩存 - 如果您預先填充了字符串,那麼重複運行會更快。 –

+0

我會運行EXPLAIN語句https://dev.mysql.com/doc/refman/5.0/en/explain.html向您顯示有關查詢的信息。你可以發佈結果,以便我們可以給出相關答案。 – Tommassiov

回答

0

專門針對此查詢,放哪裏在連接之前,這將顯着減少執行時間。 其次,爲什麼只在選擇左表的列時使用LEFT OUTER JOIN?這完全違背了LEFT JOIN的目的。所以一個簡單的連接就可以。

SELECT e.ID,e.uID,e.sID 
FROM edata e, 
    (select * from ddata 
      WHERE DATE(startDate)=DATE(NOW() 
    ) d 
WHERE e.sID=d.sID; 

一般情況下,使用EXPLAIN statement理解和優化你的查詢更好。如果你在DBMS中進行優化的基礎知識,那麼你也可以應用其他技術,如索引。

+0

加入「d」是沒有意義的,因爲它從未在選擇列表中使用過。 – jbaliuka

+0

但它用於連接條件。嵌套查詢需要一個別名。所以這是必要的。 –

+0

「SELECT e.ID,e.uID,e.sID FROM edata e」應該返回相同的結果 – jbaliuka

3

#1:您可能不想要外連接,因此將其替換爲內連接(MySQL的優化器弱確定外連接是否可以重寫爲內連接)。

#2:刪除d.startDate上的函數。

SELECT e.ID,e.uID,e.sID 
FROM edata e 
JOIN ddata d ON e.sID=d.sID 
WHERE d.startDate >= DATE(NOW()) 
AND d.StartDate < date_add(DATE(NOW(), interval 1 days);