MySQL がこのクエリで Temporary と Filesort を使用する理由
event_log テーブルと lookup_event_objects テーブルからオブジェクト統計を抽出するクエリは、パフォーマンスのボトルネックに直面しています。 EXPLAIN 出力「インデックスを使用; 一時を使用; ファイルソートを使用」で示されているように。その理由は次のとおりです。
一時テーブル
MySQL は、ORDER BY 句と GROUP BY 句の間に不一致がある場合、または順序付けまたはグループ化カラムが非属性に属している場合に一時テーブルを使用します。 -結合されたテーブル。この場合、ORDER BY 句 (count_rows DESC、leo.object_desc ASC) が GROUP BY 句 (el.object_id) と異なるため、クエリは最初の条件の影響を受けます。
Filesort
「ファイルソートの使用」は、MySQL がファイルソートで指定されたソートを実行できないことを示します。インデックスを使用した ORDER BY 句。計算フィールド (count_rows) によって順序付けしているため、データベースは完全なテーブル スキャンを実行し、結果を並べ替える必要があります。
考えられる解決策
で提案されているように提供された答えの場合、解決策は、ORDER BY 句と GROUP BY 句の間の不一致を取り除くことです。 count_rows エイリアスを GROUP BY 句内の実際の count 操作に置き換えることができます。
SELECT el.object_id, leo.object_desc, COUNT(el.object_id) AS count FROM event_log el LEFT JOIN lookup_event_objects leo ON leo.object_id = el.object_id GROUP BY el.object_id, count ORDER BY count DESC, leo.object_desc ASC;
これにより、一時テーブルとファイルソートの必要がなくなり、クエリのパフォーマンスが向上する可能性があります。
以上が私のクエリで一時テーブルとファイルソートが使用されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。