2016-05-18 9 views
1

の最適化、私は GROUP_CONCATクエリ

  • ファイル
  • filesフィールドが0または012可能な3つの分野

    メッセージ

    • idmessage
    • テキストとmessagesテーブルを持っていますの場合、message does not have files attached1の場合はの場合は0に設定されます。

      その後、私はmessages_files三つのフィールドを持つテーブル

      messages_files

      • ID
      • idmessage

      • ファイル

        idはちょうど主要である必要がありキー、idmessageはメッセージのID、fileはファイルの名前です。

      (もしあれば)メッセージとそのファイルをリストしたいと思います。

      SELECT m.*, GROUP_CONCAT(mf.file SEPARATOR ',') AS fileList 
      FROM messages m 
      LEFT JOIN messages_files mf ON mf.idmessage = m.idmessage 
      GROUP BY m.idmessage; 
      

      私の質問は:次のクエリは正常に動作しているメッセージは、ファイルを持っていないときメッセージがが0に設定されているテーブル内のファイルフィールドが、私はそれらの上でJOINを「スキップ」することができますので、クエリを高速化しますか?

      ありがとうございます!

      編集:message_files(それは外部キーです)idmessageフィールドにインデックスを持っています。

    答えて

    1

    これは、相関サブクエリを使用して速くなることがあります

    SELECT m.*, 
         (SELECT GROUP_CONCAT(mf.file SEPARATOR ',') 
         FROM messages_files mf 
         WHERE mf.idmessage = m.idmessage 
         ) as fileList 
    FROM messages m; 
    

    これは、その後messages_files(idmessage, file)にインデックスを利用することができます。

    +0

    このクエリで* EXPLAIN *を使用すると、メインクエリでALL型が返され、キーは使用されません。 – Koas