MySQL の最適化: 「インデックスの使用、一時的な使用、ファイルソートの使用」について
クエリを実行するとき、MySQL は一時テーブルの使用に頼ることがあります。 「一時ファイルを使用しています」および「ファイルソートを使用しています」というメッセージで示されるように、ファイルソート。特定のクエリのコンテキストでこれが何を意味するかを調べてみましょう:
EXPLAIN SELECT el.object_id, leo.object_desc, COUNT(el.object_id) AS count_rows FROM event_log AS el LEFT JOIN lookup_event_objects AS 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 句にない計算フィールド "count_rows" によって並べ替えられ、GROUP BY 句は結合テーブル "lookup_event_objects" の列を使用します。したがって、MySQL はグループ化とソートを実行するために一時テーブルを作成します。
「filesort の使用」
MySQL は、インデックスを使用してソート操作を実行できない場合に filesort を使用します。このクエリでは、計算フィールド "count_rows" の並べ替えにインデックスを付けることができないため、MySQL は filesort を使用して並べ替えを実行します。
最適化
このクエリを最適化するには、次のようにします。 「count_rows」にインデックスを作成できます。ただし、これは計算フィールドであるため、MySQL のトリックを使用する必要があります。
CREATE TABLE lookup_event_objects_temp AS SELECT object_id, object_desc, COUNT(DISTINCT event_id) AS count_rows FROM event_log GROUP BY object_id; CREATE INDEX idx_count_rows ON lookup_event_objects_temp (count_rows); ALTER TABLE lookup_event_objects_temp RENAME TO lookup_event_objects;
インデックス付きの "count_rows" フィールドを使用してこの一時テーブルを作成すると、クエリはインデックスを使用して効率的にクエリを実行できます。ソートにより、ファイルソートの必要性がなくなり、一時テーブルの使用量が削減されます。
以上がMySQL クエリで「Using Temporary」と「Using Filesort」が表示されるのはなぜですか? それらを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。