2012-02-28 5 views
0

からに移行中にもう一度問題が発生しています。パフォーマンスが本当に遅いですMySQLの"IN"をJOINステートメントに置き換えてください

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; 

次のSQLステートメントは、アクセスで正常に動作します。助けのための任意のアイデア?

+1

'SELECT 'の前に' EXPLAIN 'を置きます。出力を表示します。 'CREATE TABLE tbl_content'の出力も表示してください。 – Konerak

+0

おそらくあなたはあなたのAccessデータベースにないMySQLのインデックスを持っています。 – AngeloBad

答えて

1

タイトルにあなた自身の質問に答えました。一般的に言えば、MySQLはまた、関連する列は、パフォーマンスの向上のためにインデックス化されていることを確認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; 

を使用したほうが良いでしょうとしてもそうジョインとしてIN (Subquery)を最適化しません。

EDIT

さらにより多くの私は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は、それはに対してそれらを評価サブクエリの既知の問題があります外部クエリ毎回比較されます。それらを避けてください!これはおそらく、あなたがアクセスからのそのような劣化を見ている理由です。

関連する問題