2012-02-28 81 views
0

再次遇到問題時,我從訪問MySQL用JOIN聲明代替「IN」

下面的SQL語句工作正常訪問

SELECT * 
FROM tbl_content 
WHERE contentID IN (
    SELECT contentID 
    FROM tbl_tags 
    WHERE Bezeichnung IN (
       SELECT Bezeichnung 
       FROM tbl_tags t2 
       WHERE t2.contentID= " & contentID & ") 
    AND contentID <> " & contentID & ") 
AND Status = 1 
ORDER BY Datum DESC LIMIT 0,5; 

MySQL的的表現實在是太慢了。任何想法的幫助?

+1

把'EXPLAIN'放在'SELECT'之前。向我們顯示輸出。同時顯示「CREATE TABLE tbl_content」的輸出。 – Konerak 2012-02-28 09:57:46

+0

可能您在Access數據庫中沒有您的MySQL上的某些索引。 – AngeloBad 2012-02-28 09:55:33

回答

1

你已經在標題中回答了你自己的問題。一般來說,MySQL不優化IN (Subquery)以及連接,以便您將使用JOIN

SELECT * 
FROM tbl_content t1 
     INNER JOIN 
     ( SELECT ContentID 
      FROM tbl_tags t1 
        INNER JOIN 
        ( SELECT Bezeichnung 
         FROM tbl_tags t2 
         WHERE t2.contentID = " & contentID & " 
         GROUP BY Bezeichnung 
        ) t2 
         ON t1.Bezeichnung = t2.Bezeichnung 
      WHERE contentID <> " & contentID & " 
      GROUP BY ContentID 
     ) t2 
      ON t2.ContentID = t1.ContentID 
WHERE Status = 1 
ORDER BY Datum DESC LIMIT 0,5; 

同時檢查相關的列索引來提高性能會更好。

編輯

而且我越覺得EXISTS可以在MySQL中是更有效的是,但EXPLAIN應該表現出更多:

SELECT * 
FROM tbl_content t1 
WHERE EXISTS 
     ( SELECT 1 
      FROM tbl_tags t2 
      WHERE EXISTS 
        ( SELECT 1 
         FROM tbl_tags t3 
         WHERE t2.contentID = " & contentID & " 
         AND  t2.Bezeichnung = t2.Bezeichnung 
        ) 
      AND  t1.ContentID = t2.ContentID 
     ) 
AND  Status = 1 
AND  t1.contentID <> " & contentID & " 
ORDER BY Datum DESC LIMIT 0,5; 
2

MySQL有與子查詢一個已知問題,它評估它們對外部查詢每次進行比較。避免它們!這可能就是爲什麼你會看到Access的這種惡化。