主要有這9個變量。
Select_scan代表了需要做全表掃描。在 explain 中 type 會顯示為 ALL,原因是查詢沒有能用到索引。因為全表掃描一般比較慢,所以應(yīng)該盡量避免。
Select_range代表需要從硬盤讀表在一段范圍內(nèi)的行。在 explain 中顯示為 range,說明使用了索引查找記錄在硬盤上的位置。
Select_full_join和 Select_scan 差不多,區(qū)別是 Select_full_join 代表的是第二張及之后的表。explain 中的類型也是 ALL,原因是表聯(lián)接所用的字段上沒有索引。它對性能有更為嚴(yán)重的影響,絕對要避免,所以用于聯(lián)接的字段上一般都要加索引。
Select_range_check這個比 Select_full_join 要好一點,和 Select_range 差不多。區(qū)別是 MySQL 不能確定它是否能否使用一個范圍來做聯(lián)接。如果可以那么會使用范圍,如果不行仍會使用全表掃描。在 explain 中 type 也會是 ALL,但 extra 中會有 Range checked for each record (index map: ) 的說明。不能肯定是否能用范圍是因為聯(lián)接是條件不確定。如:
SELECT * FROM tbl1, tbl2 WHERE tbl1.col1 > tbl2.col1如果 tbl2.col1 上有索引,那么可以做 Select_range_check,explain的結(jié)果如下
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) | +-------------+-------+------+---------------+------+---------+------+------+------------------------------------------------+ 如果鏈接 tbl2 的時候 MySQL 判斷可以使用范圍查找,它仍然會增加 Select_range_check 而不是 Select_range。
Select_full_range_join和 Select_range_check 類似,不過 MySQL 可以肯定它能夠使用范圍查找。這時 explain 中的類型是 range。這也是需要優(yōu)化的。
Sort_scan 和 Sort_range查詢做排序,不論是因為 order by 還是 group by(除了使用了 order by NULL 的 group by),主要都是下面的三步:
Sort_merge_passesSort_merge_passes 包括兩步。MySQL 首先會嘗試在內(nèi)存中做排序,使用的內(nèi)存大小由系統(tǒng)變量 Sort_buffer_size 決定,如果它的大小不夠把所有的記錄都讀到內(nèi)存中,MySQL 就會把每次在內(nèi)存中排序的結(jié)果存到臨時文件中,等 MySQL 找到所有記錄之后,再把臨時文件中的記錄做一次排序。這再次排序就會增加 Sort_merge_passes。實際上,MySQL 會用另一個臨時文件來存再次排序的結(jié)果,所以通常會看到 Sort_merge_passes 增加的數(shù)值是建臨時文件數(shù)的兩倍。因為用到了臨時文件,所以速度可能會比較慢,增加 Sort_buffer_size 會減少 Sort_merge_passes 和 創(chuàng)建臨時文件的次數(shù)。但盲目的增加 Sort_buffer_size 并不一定能提高速度,見 How fast can you sort data with MySQL ?
Sort_row這代表了在第二步中被排序的記錄的總數(shù)。因為 Sort_range 和 Sort_scan 是一樣的,所以這個值只是說明了有多少記錄被排序,意思不大。
|
|