order排序
1.MySQL會為每個線程分配一個內存(sort_buffer)用于排序該內存大小為sort_buffer_size
1>如果排序的數據量小于sort_buffer_size,排序將會在內存中完成
2>如果排序數據量很大,內存中無法存下這么多數據,則會使用磁盤臨時文件來輔助排序,也稱外部排序
3>在使用外部排序時,MySQL會分成好幾份單獨的臨時文件用來存放排序后的數據,然后在將這些文件合并成一個大文件
sql語句:select city,name,age from t where city='杭州' order by name limit 1000
全字段排序 1.初始化 sort_buffer,確定放入 name、city、age 這三個字段;
2.從索引 city 找到第一個滿足 city='杭州’條件的主鍵 id;
3.到主鍵 id 索引取出整行,取 name、city、age 三個字段的值,存入 sort_buffer 中;
4.從索引 city 取下一個記錄的主鍵 id;
5.重復步驟 3、4 直到 city 的值不滿足查詢條件為止
6.對 sort_buffer 中的數據按照字段 name 做快速排序;
7.按照排序結果取前 1000 行返回給客戶端。
缺點: 1.造成sort_buffer中存放不下很多數據,因為除了排序字段還存放其他字段,對sort_buffer的利用效率不高
2.當所需排序數據量很大時,會有很多的臨時文件,排序性能也會很差
優點:MySQL認為內存足夠大時會優先選擇全字段排序,因為這種方式比rowid 排序避免了一次回表操作
rowid排序
1.初始化 sort_buffer,確定放入兩個字段,即 name 和 id;
2.從索引 city 找到第一個滿足 city='杭州’條件的主鍵 id;
3.到主鍵 id 索引取出整行,取 name、id 這兩個字段,存入 sort_buffer 中;
4.從索引 city 取下一個記錄的主鍵 id;
5.重復步驟 3、4 直到不滿足 city='杭州’條件為止
6.對 sort_buffer 中的數據按照字段 name 進行排序;
7.遍歷排序結果,取前 1000 行,并按照 id 的值回到原表中取出 city、name 和 age 三個字段返回給客戶端。
對比全字段排序流程圖你會發現,rowid 排序多訪問了一次表 t 的主鍵索引
優點:更好的利用內存的sort_buffer進行排序操作,盡量減少對磁盤的訪問
缺點:回表的操作是隨機IO,會造成大量的隨機讀,不一定就比全字段排序減少對磁盤的訪問
轉載于:https://juejin.im/post/5d5a37a1e51d453b373b4d0c
總結
- 上一篇: 一、认识Vue
- 下一篇: Git复习(十三)之git revert