インデックスの使用、一時的な使用、ファイルソートの使用: MySQL クエリには最適化が必要ですか?
データベース テーブルからデータを取得する場合、次のことが重要です。処理時間とリソースの消費を最小限に抑える効率的なクエリを作成します。 MySQL は、クエリの実行を高速化するためにさまざまな最適化手法を提供していますが、場合によっては、クエリが依然として最適ではない動作を示す場合があります。この場合、EXPLAIN 出力で「インデックスを使用; 一時を使用; ファイルソートを使用」を返すクエリを調べます。
提供されたクエリを調べてみましょう:
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, leo.object_desc ASC
「一時テーブルの使用」について
MySQL ドキュメントには、ORDER BY 句と GROUP BY 句の間に不一致がある場合、または ORDER BY または GROUP BY にテーブルの列が含まれている場合に、一時テーブルを作成できると記載されています。結合キューの最初のテーブル以外。このクエリでは、両方の条件が満たされています。 ORDER BY 句は計算フィールドである count_rows で並べ替え、GROUP BY 句は別のテーブルの el.object_id でグループ化します。したがって、並べ替えとグループ化のプロセスを容易にするために一時テーブルを使用します。
「Filesort の使用」を理解する
並べ替えは計算フィールド count_rows で実行されるため、この操作にはインデックスを使用できません。したがって、MySQL はファイルソートを使用します。これには、ディスクからデータを読み取り、結果を返す前にメモリ内でソートする必要があります。
クエリの最適化
パフォーマンスを向上させるためこのクエリを削除し、一時テーブルとファイルソートの使用を排除するには、次のような適切なインデックスを作成することを検討できます。
CREATE INDEX idx_event_log_object_count ON event_log(object_id, COUNT(event_id));
このインデックスにより、MySQL は各 object_id のイベント数を直接取得できるようになり、一時テーブルとファイルソートの必要性。
以上がMySQL クエリが「インデックスを使用、一時ファイルを使用、ファイルソートを使用」を使用しているのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。