2

私のクエリは非常に遅く実行されます。私のページには 2 つのレアなクエリがあります。「in」ステートメントを挿入したため、実行が遅くなりました。

    SELECT field1, field2, field3, field4, field5, field6, 
           DATE_FORMAT(field7, '%d-%m') AS field7_1, 
           DATE_FORMAT(fjield8, '%d-%m') AS field8_1 
    FROM 
         table1
    where 
       field9 in (select field1 from table2 where id = '$id_session') OR
       field10 in (select field1 from table2 where id = '$id_session')
    order by 
       field7_1 desc
   Limit 
       50, 100";

問題は「where field9 in (select field1 from table2 where id = '$id_session')」の部分だと思います。where句にある必要がある値を別のテーブルで検索しています。

読み込みに約 8 秒かかり、遅くなります。データベースのレコード数を減らしましたが、速度は向上しません。

助けてください。

4

4 に答える 4

2

通常は、IN を使用してクエリをリファクタリングし、代わりに JOIN を使用できます。

于 2013-05-22T08:18:29.087 に答える
1

結合を使用したクエリ:

SELECT field1, field2, field3, field4, field5, field6, 
       DATE_FORMAT(field7, '%d-%m') AS field7_1, 
       DATE_FORMAT(fjield8, '%d-%m') AS field8_1 
FROM table1 INNER JOIN table2
ON table1.field9 = table2.field1 OR
   table1.field10 =  table2.field1
where table2.id = '$id_session'
order by field7_1 desc
Limit 50, 100;

または、テストされていないと思います。フィールドのあいまいさを解消する必要がある場合があります-table1.それらの前に配置します。索引付け - table2.id はすでに索引付けされています。結合された列のインデックス作成 - table1 フィールド 9 と 10、およびtable2.field1が役立つ場合があります。ただし、インデックスは書き込みを遅くするため、実際の違いを生むものだけを使用してください。

大量のデータをフィルタリングおよびソートしてから、50 個の 2 番目のバッチのみを要求する方法も、応答が遅い要因の 1 つです。limit と同じ結果を得る方法があれば、日付フィールド (たとえば、先週のレコード) を操作することで、はるかに優れた結果が得られる可能性があります。

于 2013-05-22T08:31:16.893 に答える