一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

?MySQL的 select 和 sort 變量

 wellbeing_wang 2011-08-23
 
主要有這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 包括了單表查詢和多表聯(lián)接查詢中的第一個表。Select_full_join, Select_range_check 和 Select_full_range_join 用于多表聯(lián)接查詢中的第二張及之后的表。Sort 的那幾個變量則用于任何需要排序的查詢。

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)接是條件不確定。如:
  1. SELECT * FROM tbl1, tbl2 WHERE tbl1.col1 > tbl2.col1  
如果 tbl2.col1 上有索引,那么可以做 Select_range_check,explain的結(jié)果如下
  1.  mysql> EXPLAIN SELECT * FROM tbl1, tbl2 WHERE tbl1.col1 > tbl2.col1;   
  2. +-------------+-------+------+---------------+------+---------+------+------+------------------------------------------------+   
  3. | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra                                          |   
  4. +-------------+-------+------+---------------+------+---------+------+------+------------------------------------------------+   
  5. | SIMPLE      | tbl1  | ALL  | NULL          | NULL | NULL    | NULL |   27 |                                                |   
  6. | SIMPLE      | tbl2  | ALL  | col1          | NULL | NULL    | NULL |   18 | Range checked for each record (index map: 0x1) |   
  7. +-------------+-------+------+---------------+------+---------+------+------+------------------------------------------------+  

如果鏈接 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),主要都是下面的三步:
  1. 通過 where 條件找到記錄
  2. 排序
  3. 按排好的順序讀取記錄
如果第二步不被跳過,那么第三步中就會有 Sort_scan 或 Sort_range。如果第一步是 Select_scan,那么第三步將是 Sort_scan,如果第一步是 Select_range,那么第三步會是 Sort_range。但 Sort_scan 和 Sort_range 其實沒有功能上的區(qū)別,都是將需要的記錄按順序讀出來,所以性能也是一樣的。

Sort_merge_passes
Sort_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 是一樣的,所以這個值只是說明了有多少記錄被排序,意思不大。

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    蜜桃av人妻精品一区二区三区| 欧美日韩免费观看视频| 久久经典一区二区三区| 亚洲高清欧美中文字幕| 国产一区欧美午夜福利| 99热九九热这里只有精品| 亚洲乱妇熟女爽的高潮片| 欧美大胆美女a级视频| 久久精品福利在线观看| 精品伊人久久大香线蕉综合| 日韩女优精品一区二区三区| 99久久精品免费看国产高清| 亚洲欧美视频欧美视频| 91日韩欧美中文字幕| 日韩欧美第一页在线观看| 国产成人精品在线一区二区三区| 中文字幕精品一区二区三| 欧美性欧美一区二区三区| 91香蕉视频精品在线看| 欧美中文字幕一区在线| 午夜福利在线观看免费| 精品丝袜一区二区三区性色| 欧美一区二区三区不卡高清视| 免费观看成人免费视频| 国产欧美日韩不卡在线视频| 国产成人午夜福利片片| 欧美日韩国产欧美日韩| 可以在线看的欧美黄片| 区一区二区三中文字幕| 人妻内射在线二区一区| 欧美久久一区二区精品| 人妻中文一区二区三区| 性感少妇无套内射在线视频| 欧美精品亚洲精品一区| 亚洲精品成人午夜久久| 日本人妻精品有码字幕| 99国产一区在线播放| 久久久精品区二区三区| 成人国产激情福利久久| 午夜午夜精品一区二区| 国产二级一级内射视频播放|