MySQL の一時ファイルとファイルソートのトラブル: スキーマとクエリ分析
ルックアップ テーブルとログ テーブルを備えたイベント追跡システムでは、オブジェクト統計を重要度の降順で表示することを目的としたクエリでは問題が発生します。クエリは少数のエントリで正しく機能しますが、EXPLAIN 結果は最適化の可能性を示唆しています。
問題のクエリは、event_log テーブルと lookup_event_objects テーブル間の左結合を利用し、結果を object_id でグループ化し、count_rows で並べ替えています。降順、次に object_desc が昇順で続きます。ただし、このクエリは一時テーブルとファイルソートの使用に関する警告を生成します。
MySQL は、クエリに GROUP BY 句とは異なる ORDER BY 句が含まれている場合、またはソートまたはグループ化が他のテーブルから参照されている場合に、一時テーブルを使用します。結合の最初のもの。この場合、並べ替えは計算フィールドに基づいて行われるため、インデックスの使用が不可能になるため、filesort を使用します。
この問題に対処するには、leo.object_desc の ORDER BY 句を削除します。これにより、一時テーブルとファイルソートの必要性がなくなり、クエリのパフォーマンスが向上します:
<code class="sql">EXPLAIN SELECT el.object_id, leo.object_desc, COUNT(el.object_id) as count_rows FROM event_log el LEFT JOIN lookup_event_objects leo ON leo.object_id = el.object_id GROUP BY el.object_id ORDER BY count_rows DESC;</code>
以上がMySQL クエリによって一時テーブルとファイルソートが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。