InnoDB LRU
innodb 對 Bufffer Pool 的 LRU 算法做了優化,即:第一次從磁盤讀入內存的數據頁,會先放在 old 區域。如果 1 秒之后這個數據頁不再被訪問了,就不會被移動到 LRU 鏈表頭部,這樣對 Buffer Pool 的命中率影響就不大。

LRU:淘汰最久未使用的數據。
在 innodb 實現上,按照 5:3 的比例把整個 LRU 鏈表分成了 young 區域和 old 區域。
LRU_old 指向的就是 old 區域的第一個位置,是整個鏈表的 5/8 處。
靠近鏈表頭部的 5/8 是 young 區域,靠近鏈表尾部的 3/8 是 old 區域。
//在 young 區域,因此和優化前的 LRU 算法一樣。
//新插入的數據放入到LRU_OLD處,Old list 存儲那些低頻使用的數據(默認占整個BUFFER的3/8)
//Old list內的任何一個塊數據被再次訪問,innodb都會把它加入到Young list的頭部。
--?innodb_old_blocks_time 控制的
這個參數用來表示 頁讀取到mid位置后,需要等待多久才會被加入到LRU列表的熱端。
使LRU列表中的熱點數據不被刷出:
set global innodb_old_blocks_time=1000;
1
放在冷熱數據交界處,默認1000ms,過了這1s,還能存活下去,就調到熱數據區了。
若存在時間超過了1秒,移動到鏈表頭部。
#######################
掃描 200G 的歷史數據表為例:
掃描過程中,需要新插入的數據頁,都被放到 old 區域 ;
一個數據頁里面有多條記錄,這個數據頁會被多次訪問到,但由于是順序掃描,這個數據頁第一次被訪問和最后一次被訪問的時間間隔不會超過 1 秒,因此還是會被保留在 old 區域;
再繼續掃描后續的數據,之前的這個數據頁之后也不會再被訪問到,于是始終沒有機會移到鏈表頭部(也就是 young 區域),很快就會被淘汰出去。可以看到,這個策略最大的收益,就是在掃描這個大表的過程中,雖然也用到了 Buffer Pool,但是對 young 區域完全沒有影響,從而保證了 Buffer Pool 響應正常業務的查詢命中率。
MySQL
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。