MySQLのselectとsort変数

3476 ワード

詳細
いつもstatusのSelect%の変数の具体的な意味を忘れてしまいますが、今回はいっそ後で調べるために書きます.
主にこの9つの変数があります.
1. Select_scan
2. Select_range
3. Select_full_join
4. Select_range_check
5. Select_full_range_join
6. Sort_scan
7. Sort_range
8. Sort_merge_passes
9. Sort_rows
ここでSelect_scanとSelect_rangeには、単一テーブルクエリーとマルチテーブル結合クエリーの最初のテーブルが含まれます.Select_full_join, Select_range_checkとSelect_full_range_joinは、クエリーの2番目のテーブルとそれ以降のテーブルを結合するために使用されます.Sortのいくつかの変数は、ソートが必要なクエリーに使用されます.
Select_scan
全テーブルスキャンが必要であることを示します.クエリがインデックスを使用できなかったため、explainでtypeがALLとして表示されます.全表スキャンは一般的に遅いので、できるだけ避けるべきです.
Select_range
ハードディスク(HDD)からテーブルの範囲内のローを読み取る必要があります.explainにrangeと表示され、インデックスを使用してハードディスクに記録されている場所を検索することを示します.
Select_full_join
およびSelect_scanの差は多くありません.違いはSelectです.full_joinは2枚目以降の表を表しています.explainのタイプもALLです.テーブル結合に使用されるフィールドにインデックスがないためです.パフォーマンスに深刻な影響を及ぼすため、絶対に避ける必要があります.したがって、結合に使用するフィールドには通常インデックスが追加されます.
Select_range_check
これはSelectよりfull_ジョイと仲良くしてSelect_rangeの差は多くない.違いは、MySQLが結合に1つの範囲を使用できるかどうかを判断できないことです.可能な場合は範囲が使用され、できない場合は全テーブルスキャンが使用されます.explainではtypeもALLになりますが、extraではRange checked for each record(index map:)の説明があります.結合が条件不確定であるため、範囲が使用できるかどうかは確定できません.次のようになります.
SELECT * FROM tbl1, tbl2 WHERE tbl1.col1 > tbl2.col1
tbl 2の場合col 1にインデックスがあればSelect_range_check,explainの結果は次の通りです.
   mysql> EXPLAIN SELECT * FROM tbl1, tbl2 WHERE tbl1.col1 > tbl2.col1;
+-------------+-------+------+---------------+------+---------+------+------+------------------------------------------------+
| select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------------+-------+------+---------------+------+---------+------+------+------------------------------------------------+
| SIMPLE | tbl1 | ALL | NULL | NULL | NULL | NULL | 27 | |
| SIMPLE | tbl2 | ALL | col1 | NULL | NULL | NULL | 18 | Range checked for each record (index map: 0x1) |
+-------------+-------+------+---------------+------+---------+------+------+------------------------------------------------+

tbl 2をリンクしたときにMySQLが範囲検索が可能だと判断した場合、Select_が追加されます.range_Selectではなくcheckrange.
Select_full_range_join
およびSelect_range_checkは似ていますが、MySQLは範囲検索が可能であることは間違いありません.このときexplainのタイプはrangeです.これは結合の中で最も良い状況です.
Sort_scanとSort_range
クエリーをソートするには、order byでもgroup byでも(order by NULLを使用したgroup byを除く)、主に次の3つのステップがあります.
1.where条件でレコードを見つける
2.並べ替え
3.記録を順番に読み取る
ステップ2がスキップされなければ、ステップ3にSort_があります.scanまたはSort_range.最初のステップがSelect_の場合scan、3番目のステップはSort_scan、最初のステップがSelect_であればrange、じゃあ3歩目はSort_range.だが...scanとSort_rangeは機能的な違いはなく、必要なレコードを順番に読み出すので、性能も同じです.
Sort_merge_passes
Sort_merge_passesには2つのステップが含まれています.MySQLではまずメモリのソートを試み、使用するメモリサイズはシステム変数Sort_buffer_sizeは、サイズが足りなければすべてのレコードをメモリに読み込むと、MySQLはメモリでソートした結果をテンポラリファイルに保存し、MySQLがすべてのレコードを見つけてから、テンポラリファイルのレコードをソートすることにします.これを再ソートするとSort_が増加しますmerge_passes.実際、MySQLは別の一時ファイルで再ソートの結果を保存するので、通常はSort_merge_passesが増加した数値は、一時ファイルの数の2倍です.テンポラリファイルを使用しているので、速度が遅くなる可能性があります.Sort_を増やします.buffer_sizeはSort_を減らすmerge_passesと一時ファイルの作成回数.だが盲目的に増加したbuffer_sizeは必ずしもスピードを上げることはできません.How fast can you sort data with MySQLを参照してください.
Sort_row
これは、ステップ2でソートされたレコードの合計数を表します.なぜならrangeとSort_scanは同じなので、この値はどれだけのレコードがソートされているかを説明しているだけで、意味がありません.