2014-02-18 148 views
-1

在mysql上進行以下查詢時,其執行時間大約爲10秒。如何優化這個需要很長時間的查詢。

SELECT SQL_CALC_FOUND_ROWS DISTINCT 
      b.appearance_id, 
      b.photo_album_id, 
      b.eventcmmnt_id, 
      b.id, 
      b.mem_id, 
      b.subj, 
      b.body, 
      b.image_link as photo_image_uploaded, 
      b.bottle_id, 
      b.date, 
      b.parentid, 
      b.from_id, 
      b.visible_to, 
      pa.photo_big as image_link, 
      b.post_via, 
      b.youtubeLink, 
      b.link_image, 
      b.link_url, 
      b.auto_genrate_text, 
      badges.badge_img, 
      badges.badge_bottle_img, 
      b.type,b.share_url_title 
    FROM bulletin b 
      INNER JOIN network n 
        ON (n.mem_id = b.mem_id) 
      LEFT JOIN badges 
        ON (b.bottle_id=badges.badge_id) 
      LEFT JOIN photo_album as pa 
        ON (pa.photo_id=b.photo_album_id) 
      JOIN members mem 
        ON (b.mem_id=mem.mem_id and mem.deleted<>'Y') 
    WHERE b.parentid = '0' 
      AND ('$userid' IN (n.frd_id, b.mem_id,b.from_id)) 
GROUP BY b.id 
ORDER BY b.id DESC 
    LIMIT 0,10 

IN約束內側的內部查詢有許多frd_id,mem_id,from_id所以我覺得,因爲上面執行查詢時慢......所以,請幫助優化上面的查詢

感謝

+0

嘗試使用mysql的'explain plan' –

+1

哇這是一個sql查詢的地獄。 – UmNyobe

+0

沒人知道你的模式或索引 –

回答

0

檢查,你在字段上有索引,用於連接。

+4

這不是答案,應該在評論部分。 –

0

正如您已經暗示,發佈EXPLAIN SELECT...計劃的查詢。爲什麼猜你什麼時候可以檢查? (並且SQL小提琴也會很棒)。

這將告訴你是否需要索引(非常非常可能!)以及哪些索引和結構如何(不要去索引所有內容,因爲這可能會損害性能!)。

一個建議,我已經可以得出:如果你對形式

(mem_id, deleted, ...) 

members的索引字段,你應該確認deleted確實是一個boolean(如果不是,將其轉換爲「Y」和「N」)的enum,並指定條件是這樣的:

on(b.mem_id=mem.mem_id AND NOT mem.deleted) 

,因爲這會更容易的索引。如果字段是而不是布爾值,例如它可能具有「待定」的值「Y」,「N」和「P」,並且您使用了varchar字段,則<>對索引具有相當大的性能影響 - 我甚至會出門,說這個指數是有效的中和。索引與匹配效果最好,而不是不匹配<>

我懷疑通過移動它,雖然部分,在bJOIN你也可以重新設計這種表達

AND ('$userid' IN (n.frd_id, b.mem_id,b.from_id)) 

。或者你可以考慮使用UNION來代替你的表的基數。

+0

謝謝isemi,我需要改變IN查詢存在clouse,所以你能告訴我我怎麼辦? – JAY

+0

對不起,我不明白你的意思。你需要做什麼?你能舉一個例子嗎? – LSerni