當前位置:網站首頁>Mysql存儲原理(2)
Mysql存儲原理(2)
2022-01-27 10:32:59 【Chen_leilei】
今天我們來講一下排序
mysql的排序方式是,我們先根據條件查詢出結果集,然後在內存中對結果集進行排序,如果結果集數量比較大,還需要將結果集寫入到多個文件中去,然後單獨進行排序,然後在文件間進行歸並排序,排序完成後在進行 limit 操作。
CREATE TABLE `person` (
`id` int(11) NOT NULL,
`city` varchar(16) NOT NULL,
`name` varchar(16) NOT NULL,
`age` int(11) NOT NULL,
`addr` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `city` (`city`)
) ENGINE=InnoDB;
select city,name,age from person where city='武漢' order by name limit 100 ;
使用 explain 發現該語句會使用 city 索引,並且會有 filesort . 我們分析下該語句的執行流程
-
1.初始化 sortbuffer ,用來存放結果集
-
2.找到 city 索引,定比特到 city 等於武漢的第一條記錄,獲取主鍵索引ID
-
3.根據 ID 去主鍵索引上找到對應記錄,取出 city,name,age 字段放入 sortbuffer
-
4.在 city 索引取下一個 city 等於武漢的記錄的主鍵ID
-
5.重複上面的步驟,直到所有 city 等於武漢的記錄都放入 sortbuffer
-
6.對 sortbuffer 裏的數據根據 name 做快速排序
-
7.根據排序結果取前面 1000 條返回
這裏面查詢得是city,name,age三個字段,比較少。如果查詢得字段比較多,他們都會放在sortbuffer裏面,sortbuffer會占據大量內存空間。另一個方案就是只取出待排的字段和主鍵放在sortbuffer裏面,這裏是 name 和 id ,排序完成後在根據 id 取出需要查詢的字段返回,其實就是時間換取空間的做法,這裏通過 max_length_for_sort_data 參數控制,是否采用後面的方案進行排序。
另外如果 sortbuffer 裏的條數很多,同樣會占有大量的內存空間,可以通過參數 sort_buffer_size 來控制是否需要借助文件進行排序,這裏會把 sortbuffer 裏的數據放入多個文件裏,用歸並排序的思路最終輸出一個大的文件。
以上方案主要是 name 字段沒有加上索引,如果 name 字段上有索引,由於索引在構建的時候已經是有序的了,所以就不需要進行額外的排序流程只需要在查詢的時候查出指定的條數就可以了,這將大大提昇查詢速度。我們現在加一個 city 和 name 的聯合索引
alter table person add index city_user(city, name);
-
1.根據 city,name 聯合索引定比特到 city 等於武漢的第一條記錄,獲取主鍵索引ID
-
2.根據 ID 去主鍵索引上找到對應記錄,取出 city,name,age 字段作為結果集返回
-
3.繼續重複以上步驟直到 city 不等於武漢,或者條數大於 1000
由於聯合所以在構建索引的時候,在 city 等於武漢的索引節點中的數據已經是根據 name 進行排序了的,所以這裏只需要直接查詢就可,另外這裏如果加上 city, name, age 的聯合索引,則可以用到索引覆蓋,不用到主鍵索引上進行回錶。
版權聲明
本文為[Chen_leilei]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2022/01/202201271032591052.html
邊欄推薦
猜你喜歡
隨機推薦
- uniapp上傳圖片及組件傳值
- 瑞利年金險資金保障安全嗎?收益高不高啊?
- 華為手機USB連不上電腦的解决方法
- Flutter 2,移動金融應用開發
- 關於st25系列NFC標簽簡單介紹及st25TV系列用於門禁讀取時的注意事項總結
- 關於用ffmpeg轉手機視頻發現視頻長寬倒了的問題
- 函數 / 類模板--模板2
- 數組中的第k個最大的元素--優先級隊列、排序、堆、排序
- 單片機實例27——ADC0809A/D轉換器基本應用技術(硬件電路圖+匯編程序+C語言程序)
- Collection集合的學習
- 一場面試結束,某度員工從事Android 5年為何還是初級工程師?
- 3本書閱讀筆記【人月神話-Go語言實戰-研發能力持續成長路線】01
- PHP垃圾回收機制
- 【電子技術】什麼是LFSR?
- 死鎖?如何定比特到死鎖?如何修複死鎖?(jps和jstack兩個工具)
- 快樂寒假 22/01/20
- image
- 噴程序員?SURE?
- LDO分壓電阻計算小工具
- 面試之求一串字符串中每個字符的出現次數
- 【ISO15765_UDS&OBD診斷】-01-概述
- 【Mysql上分之路】第九篇:Mysql存儲引擎
- RHCE 第一次作業
- 2021.10.16我的第一篇博客:一切皆有可能!
- CTA-敏感行為-讀取IMEI
- 面試被問怎麼排查平時遇到的系統CPU飆高和頻繁GC,該怎麼回答?
- nuxt項目總結-綜合
- 自然語言處理學習筆記(一)
- C語言第一課
- 各比特大佬,Spark的重點難點系列暫時更新完畢
- 基於 esbuild 的 universal bundler 設計
- XCTFre逆向(四):insanity
- 理解什麼是真正的並發數
- JVM腦圖
- 【Pytorch(四)】學習如何使用 PyTorch 讀取並處理數據集
- 函數棧幀的創建與銷毀
- 構建神經網絡- 手寫字體識別案例
- 多模態生成模型ERNIE-VILG
- kotlin不容忽視的小細節
- 備戰一年,終於斬獲騰訊T3,我堅信成功是可以複制的