ホームページ  >  記事  >  データベース  >  MySQL クエリが「インデックスを使用、一時ファイルを使用、ファイルソートを使用」を使用しているのはなぜですか?

MySQL クエリが「インデックスを使用、一時ファイルを使用、ファイルソートを使用」を使用しているのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-04 09:42:02756ブラウズ

Why is My MySQL Query Using

インデックスの使用、一時的な使用、ファイルソートの使用: 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 サイトの他の関連記事を参照してください。

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