ORDER BY の速度を向上させたい場合は、まず MySQL が追加の並べ替えプロセスの代わりにインデックスを使用できるかどうかを確認する必要があります。インデックスを使用できない場合は、次の戦略に従ってみてください:
sort_buffer_size の値を増やします。
read_rnd_buffer_size の値を増やします。
tmpdir を変更して、多くの空き領域のある専用のファイル システムを指すようにします。 MySQL 4.1 以降を使用している場合、このオプションにより、循環形式で複数のパスが許可されます。パスは、Unix ではコロン (「:」) で区切られ、Windows、NetWare、および OS/2 ではセミコロン (「;」) で区切られます。この機能を使用すると、複数のディレクトリ間で負荷を均等に分散できます。注: これらのパスは、同じ物理ディスク上の異なるディレクトリではなく、異なる物理ディスクに分散されたディレクトリである必要があります。
デフォルトでは、MySQL は、ORDER BY col1、col2、... クエリと同様に、すべての GROUP BY col1、col2、... クエリもソートします。同じフィールド リストを持つ ORDER BY 句を明示的に含めると、ソートが常に行われるため、MySQL は最適化時に速度を低下しません。クエリに GROUP BY が含まれているが、結果の並べ替えのオーバーヘッドを回避したい場合は、ORDER BY NULL を使用して並べ替えをキャンセルできます。例:
INSERT INTO foo
SELECT a, COUNT(*) FROM bar GROUP BY a ORDER BY NULL;
7.2.10 MySQL LIMIT を最適化する方法
場合によっては、MySQL で次のような問題が発生することがあります。 LIMIT row_count を使用するが HAVING
を使用しないクエリは、別の方法で処理されます:
いくつかのレコードを取得するために LIMIT を使用しているだけの場合、MySQL はインデックスを使用することもありますが、通常は完全なテーブルを使用します。スキャン。
LIMIT row_count が ORDER BY とともに使用される場合、MySQL はテーブル全体をソートするのではなく、row_count レコードを見つけた後にソートを停止します。