ホームページ  >  記事  >  データベース  >  MySQL クエリで「Using Temporary」と「Using Filesort」が表示されるのはなぜですか? それらを最適化するにはどうすればよいですか?

MySQL クエリで「Using Temporary」と「Using Filesort」が表示されるのはなぜですか? それらを最適化するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-04 17:04:02278ブラウズ

Why Do MySQL Queries Show

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 句が存在するか、ORDER BY または GROUP BY に結合キューの最初のテーブル以外のテーブルの列が含まれています。

指定されたクエリでは、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。