一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫 - Mysql - MySQL Order By索引優(yōu)化方法

MySQL Order By索引優(yōu)化方法

2019-12-06 15:51MySQL教程網(wǎng) Mysql

在一些情況下,MySQL可以直接使用索引來滿足一個 ORDER BY 或 GROUP BY 子句而無需做額外的排序

盡管 ORDER BY 不是和索引的順序準(zhǔn)確匹配,索引還是可以被用到,只要不用的索引部分和所有的額外的 ORDER BY 字段在 WHERE 子句中都被包括了。 

使用索引的MySQL Order By 
下列的幾個查詢都會使用索引來解決 ORDER BY 或 GROUP BY 部分: 

復(fù)制代碼代碼如下:


SELECT * FROM t1 ORDER BY key_part1,key_part2,... ; 
SELECT * FROM t1 WHERE key_part1=constant ORDER BY key_part2; 
SELECT * FROM t1 WHERE key_part1=constant GROUP BY key_part2; 
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC; 
SELECT * FROM t1 WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2 DESC; 


不使用索引的MySQL Order By 
在另一些情況下,MySQL無法使用索引來滿足 ORDER BY,盡管它會使用索引來找到記錄來匹配 WHERE 子句。這些情況如下: 
* 對不同的索引鍵做 ORDER BY : 
SELECT * FROM t1 ORDER BY key1, key2; 
* 在非連續(xù)的索引鍵部分上做 ORDER BY: 
SELECT * FROM t1 WHERE key2=constant ORDER BY key_part2; 
* 同時使用了 ASC 和 DESC: 
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC; 
* 用于搜索記錄的索引鍵和做 ORDER BY 的不是同一個: 
SELECT * FROM t1 WHERE key2=constant ORDER BY key1; 
* 有很多表一起做連接,而且讀取的記錄中在 ORDER BY 中的字段都不全是來自第一個非常數(shù)的表中(也就是說,在 EXPLAIN 分析的結(jié)果中的第一個表的連接類型不是 const)。 
* 使用了不同的 ORDER BY 和 GROUP BY 表達式。 
* 表索引中的記錄不是按序存儲。例如,HASH 和 HEAP 表就是這樣。 

通過執(zhí)行 EXPLAIN SELECT ... ORDER BY,就知道MySQL是否在查詢中使用了索引。如果 Extra 字段的值是 Using filesort,則說明MySQL無法使用索引。詳情請看"7.2.1 EXPLAIN Syntax (Get Information About a SELECT)"。當(dāng)必須對結(jié)果進行排序時,MySQL 4.1以前 它使用了以下 filesort 算法: 

復(fù)制代碼代碼如下:


1. 根據(jù)索引鍵讀取記錄,或者掃描數(shù)據(jù)表。那些無法匹配 WHERE 分句的記錄都會被略過。 
2. 在緩沖中每條記錄都用一個‘對'存儲了2個值(索引鍵及記錄指針)。緩沖的大小依據(jù)系統(tǒng)變量 sort_buffer_size 的值而定。 
3. 當(dāng)緩沖慢了時,就運行 qsort(快速排序)并將結(jié)果存儲在臨時文件中。將存儲的塊指針保存起來(如果所有的‘對'值都能保存在緩沖中,就無需創(chuàng)建臨時文件了)。 
4. 執(zhí)行上面的操作,直到所有的記錄都讀取出來了。 
5. 做一次多重合并,將多達 MERGEBUFF(7)個區(qū)域的塊保存在另一個臨時文件中。重復(fù)這個操作,直到所有在第一個文件的塊都放到第二個文件了。 
6. 重復(fù)以上操作,直到剩余的塊數(shù)量小于 MERGEBUFF2 (15)。 
7. 在最后一次多重合并時,只有記錄的指針(排序索引鍵的最后部分)寫到結(jié)果文件中去。 
8. 通過讀取結(jié)果文件中的記錄指針來按序讀取記錄。想要優(yōu)化這個操作,MySQL將記錄指針讀取放到一個大的塊里,并且使用它來按序讀取記錄,將記錄放到緩沖中。緩沖的大小由系統(tǒng)變量 read_rnd_buffer_size 的值而定。這個步驟的代碼在源文件 `sql/records.cc' 中。 



這個逼近算法的一個問題是,數(shù)據(jù)庫讀取了2次記錄:一次是估算 WHERE 分句時,第二次是排序時。盡管第一次都成功讀取記錄了(例如,做了一次全表掃描),第二次是隨機的讀取(索引鍵已經(jīng)排好序了,但是記錄并沒有)。在MySQL 4.1 及更新版本中,filesort 優(yōu)化算法用于記錄中不只包括索引鍵值和記錄的位置,還包括查詢中要求的字段。這么做避免了需要2次讀取記錄。改進的 filesort 算法做法大致如下: 
1. 跟以前一樣,讀取匹配 WHERE 分句的記錄。 
2. 相對于每個記錄,都記錄了一個對應(yīng)的;‘元組'信息信息,包括索引鍵值、記錄位置、以及查詢中所需要的所有字段。 
3. 根據(jù)索引鍵對‘元組'信息進行排序。 
4. 按序讀取記錄,不過是從已經(jīng)排序過的‘元組'列表中讀取記錄,而非從數(shù)據(jù)表中再讀取一次。 

使用改進后的 filesort 算法相比原來的,‘元組'比‘對'需要占用更長的空間,它們很少正好適合放在排序緩沖中(緩沖的大小是由 sort_buffer_size 的值決定的)。因此,這就可能需要有更多的I/O操作,導(dǎo)致改進的算法更慢。為了避免使之變慢,這種優(yōu)化方法只用于排序‘元組'中額外的字段的大小總和超過系統(tǒng)變量 max_length_for_sort_data 的情況(這個變量的值設(shè)置太高的一個表象就是高磁盤負載低CPU負載)。想要提高 ORDER BY 的速度,首先要看MySQL能否使用索引而非額外的排序過程。如果不能使用索引,可以試著遵循以下策略: 
* 增加 sort_buffer_size 的值。 
* 增加 read_rnd_buffer_size 的值。 
* 修改 tmpdir,讓它指向一個有很多剩余空間的專用文件系統(tǒng)。 
如果使用MySQL 4.1或更新,這個選項允許有多個路徑用循環(huán)的格式。各個路徑之間在 Unix 上用冒號(':')分隔開來,在 Windows,NetWare以及OS/2 上用分號(';')。可以利用這個特性將負載平均分攤給幾個目錄。注意:這些路徑必須是分布在不同物理磁盤上的目錄,而非在同一個物理磁盤上的不同目錄。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧美人妖另类性hd | 男人狂擦女人的下面视频 | 色哺乳妇hd | 和直男装修工在工地啪 | 996热精品视频在线观看 | 美女张开腿让男人桶的 视频 | 波多野结衣在线中文 | 国产精品99精品久久免费 | 嫩草影院精品视频在线观看 | 偷偷狠狠的日日高清完整视频 | 91天堂影院 | 九二淫黄大片看片 | 男男gaygays黑人 | 99re视频精品全部免费 | 性欧美video 性满足久久久久久久久 | 色老板在线观看 | 青青草一区二区免费精品 | 亚洲天堂2016| 91在线免费播放 | 免费的网址| 欧美日韩高清完整版在线观看免费 | 男同互操 | 欧美高清乌克兰精品另类 | 免费特黄一级欧美大片在线看 | 国模一区二区三区视频一 | 大伊香蕉精品二区视频在线 | 精品一产品大全 | 久久久无码精品无码国产人妻丝瓜 | 特级夫妻大片免费在线播放 | 毛片影院| 99精品免费观看 | 韩国三级日本三级香港三级黄 | 思思99热久久精品在2019线 | 网站视频免费 | 精品亚洲永久免费精品 | 99re这里只有精品视频 | 亚洲精品国产成人 | 精久久| 欧美一级v片 | 亚洲AV无码国产精品色在线看 | 久久re亚洲在线视频 |