MySql - 對select是怎麼處理的

咱們知道MySql數據是存在磁盤的,也從上一篇文章知道他是怎麼讀取磁盤文件的數據。那咱們經過select查詢數據的時候,就會從磁盤讀到MySql,而後返回給客戶端。
image.png
咱們能夠試想一下,假設有個熱數據,咱們每秒須要查10次,按照上面的流程,就要查10次磁盤,儘管有索引的存在,那效率也是很低的,因此MySql有一個緩衝池Buffer Pool,把每次查詢的數據存放在Buffer Pool裏,後面若是再查這個數據,就直接從Buffer Pool裏取,就避免了每次從磁盤查找,性能就有了很大的提高。
在磁盤中,咱們每次查詢的時候,會定位到數據頁,而後二分查找某一行,在Buffer Pool中,他也是相似的,因此咱們查找到某一條數據的時候,他就會把這個數據所在的數據頁加載到Buffer Pool。
image.png
把數據頁的信息加載到Buffer Pool時,咱們稱之爲緩存頁,他也是16kb,另外每一個緩存頁還對應着描述數據,這些描述數據包括緩存頁的信息(好比地址)、數據頁的信息等。咱們假設Buffer Pool的大小是160kb,那他就有10個緩存頁和10個描述數據,因此Buffer Pool實際大小會超過160kb。
image.png
當從磁盤讀取一個數據頁的時候,咱們須要知道把他放在哪一個緩存頁裏,也須要知道緩存頁的地址,這些信息是存在描述數據裏的,因此MySql維護了一個雙向鏈表數據結構的free鏈表,當尚未加載數據頁的時候,他的結構是這樣的(這裏描述數據就畫了6個,以及忽略了描述數據到緩存頁的指向):
image.png
當咱們加載一個數據頁的時候,會先從free鏈表判斷是否還有描述數據,若是有,說明緩存頁尚未滿,那就把數據頁的信息加載到緩存頁中。同時把這個描述信息從free鏈表中移除,而後加入到雙向鏈表數據結構的LRU鏈表。LRU鏈表就是會把最新訪問的移動到頭部去。
image.png
若是沒有,說明緩存頁都有數據了。上面的LRU鏈表做用就在這裏體現了,既然緩存頁都滿了,那確定會淘汰已有的緩存頁給新的緩存頁,LRU鏈表就是把鏈表最後面的,也就是最少訪問的描述數據對應的緩存頁的數據刷入磁盤,而後把這個緩存頁給新的數據頁。
image.png緩存

相關文章
相關標籤/搜索