order by
ソートの最適化
1. ORDER BY
句は、filesortによる並べ替えを避け、できるだけインデックスで並べ替える必要があります。
2. ORDER BYは、indexメソッドを使用してソートする2つの方法を満たします。
- インデックス左端の列を使用して並べ替え
- where句とorder by句の条件付き列の組み合わせを使用して、左端のフロントインデックス列を満たす
3.インデックス列にない場合、filesortには2つのアルゴリズムがあり、mysqlは双方向および一方向のソートを開始します。
- 双方向ソート
(1)mysql4.1より前では、双方向ソートが使用され、ディスクを2回スキャンし、最終的にデータを取得し、行ポインターと列ごとの順序を読み取り、ソートしてから、リストに従ってソートされたリストをスキャンしていましたの値がデータベースリストから再度読み取られ、対応するデータが出力されます。
(2)ディスクからフィールドを読み取り、それらをバッファーでソートしてから、ディスクから他のフィールドを取得します。
(3)データのバッチをフェッチするには、ディスクを2回スキャンし、2つのI / O操作を実行します。I/ O操作には時間がかかるため、インデックスは4.1の単方向ソート後に別のアルゴリズムを使用します。 - 単一方向の並べ替え
クエリで必要な列をディスクから読み取り、列の順序に従ってバッファを並べ替え、並べ替えられたリストをスキャンして出力します。効率的で、2回目のデータの読み取りを回避できます。ランダムI / OはシーケンシャルI / Oになりますが、データをメモリに保持するため、より多くのメモリ領域を使用します。
並べ替えバッファでは、一方向の並べ替えは双方向の並べ替えよりも多くのメモリ領域を使用することに注意してください。一方向の並べ替えではすべてのフィールドが取り出されるため、すべてのフィールドで抽出データの合計サイズがsort_bufferの容量を超え、結果としてsort_bufferのサイズでデータをソートし(tmpを作成、多方向マージ)、sort_bufferのサイズをソートし、再度ソートして、結果として複数のI / Oが発生します。
4. ORDER BYの効率を改善する
ORDER BYは必須フィールドのみを検索します。*はタブーです。これは非常に重要です。影響は次のとおりです。
- 検索されたフィールドの合計がmax_length_for_sort_data未満で、ソートフィールドがTEXTまたはBLOBでない場合、改良されたアルゴリズムが一方向ソートに使用され、それ以外の場合は多方向ソートが使用されます。
- Sort_buffer 2つのアルゴリズムは、複数のI / Oで、その結果、ソートtmpのファイルのマージを作成し、超えたの容量を超える可能性がありますが、風単一のアルゴリズムが高い、それはsort_buffer_sizeを上げるために、この時点で適切である。
(2 )sort_buffer_sizeのサイズを増やしてみてください。
どのアルゴリズムでも、sort_buffer_sizeを適切に増やすと効率が向上しますが、このパラメーターはプロセスごとにあるため、システムの能力に応じて改善する必要があります。
(3)
このパラメーターを増やすためにmax_length_for_sort_dataを増やしてみてください。一方向の並べ替えアルゴリズムを使用する可能性が高くなります。設定が高すぎると、合計データ容量がsort_buffer_sizeを超える可能性が高くなり、明らかな症状はI / Oアクティビティが高くなり、低くなります。プロセッサー使用率。