国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

MySQL系列:緩沖池Buffer Pool的設計思想

數據庫 MySQL
本節主要講了三鏈表的作用,free鏈表記錄空閑緩存頁,flush鏈表記錄臟頁,即待刷盤緩存頁,當free鏈表沒有空閑時,lru鏈表淘汰最近不常用的緩存頁。

1. 回顧

我們主要講了InnoDB的存儲引擎,其中主要的一個組件就是緩存池Buffer Pool,緩存了磁盤的真實數據,然后基于緩存做增刪改查操作,同時配合了后續的redo log、刷磁盤等機制和操作。如下圖:

這一篇,深入該組件內部,學習一下其設計思想。

2. Buffer Pool數據結構

Buffer Pool本質其實就是數據庫的一個內存組件,默認情況下是128MB,如果我們的數據庫如果是16核32G的機器,那么你就可以給Buffer Pool分配個2GB的內存,使用下面的配置就可以了
innodb_buffer_pool_size = 2147483648

磁盤加載數據頁到緩存,數據頁在緩存中被定義為緩存頁,緩存頁與緩存頁默認16KB,每個緩存頁有對應的描述數據,描述了這個數據頁所屬的表空間、數據頁的編號、這個緩存頁在Buffer Pool中的地址等。在Buffer Pool中,每個緩存頁的描述數據放在最前面,各個緩存頁放在后面。Buffer Pool中的描述數據大概相當于緩存頁大小的5%左右,也就是每個描述數據大概是800個字節左右的大小,然后假設你設置的buffer pool大小是128MB,實際上Buffer Pool真正的最終大小會超出一些,可能有個130多MB的樣子,因為他里面還要存放每個緩存頁的描述數據。

數據結構如下圖:

3. free鏈表

接著我們來看下一個問題,當數據庫運行起來之后,肯定會不停的執行增刪改查的操作,此時就需要不停的從磁盤上讀取一個一個的數據頁放入Buffer Pool中的對應的緩存頁里去,把數據緩存起來,那么以后就可以對這個數據在內存里執行增刪改查了。但是此時在從磁盤上讀取數據頁放入Buffer Pool中的緩存頁的時候,必然涉及到一個問題,就是哪些緩存頁是空閑的?

所以數據庫會為Buffer Pool設計一個free鏈表,他是一個雙向鏈表數據結構,這個free鏈表里,每個節點就是一個空閑的緩存頁的描述數據塊的地址,也就是說,只要你一個緩存頁是空閑的,那么他的描述數據塊就會被放入這個free鏈表中。如果要把數據頁寫入緩存頁,就從鏈表中摘除這個節點,將該節點的描述數據寫到Buffer pool,再把寫入對應的緩存頁。

寫入之前還會判斷該數據頁是否已經被緩存,引入哈希表數據結構,他會用表空間號+數據頁號,作為一個key,然后緩存頁的地址作為value,當要使用一個數據頁的時候,通過“表空間號+數據頁號”作為key去這個哈希表里查一下,如果沒有就讀取數據頁,如果已經有了,就說明數據頁已經被緩存了。

如下圖所示:

4. flush鏈表

更新過的緩存頁與磁盤不一致,需要刷到磁盤的緩沖頁構成的雙向鏈表;也叫待刷盤的臟頁數據頁鏈表;如下圖所示

5. lru鏈表

如果所有的緩存頁都被塞了數據了,此時無法從磁盤上加載新的數據頁到緩存頁里去了,那么此時你只有一個辦法,就是淘汰掉一些緩存頁。引入LRU鏈表來判斷哪些緩存頁是不常用的。這個所謂的LRU就是Least Recently Used,最近最少使用的意思。

假設某個緩存頁的描述數據塊本來在LRU鏈表的尾部,后續你只要查詢或者修改了這個緩存頁的數據,也要把這個緩存頁挪動到LRU鏈表的頭部去,也就是說最近被訪問過的緩存頁,一定在LRU鏈表的頭部。如下圖所示

淘汰不常用的緩存頁,尾部淘汰冷數據,頭部插入熱數據。

6. 數據頁預讀帶來的問題

MySQL為提升讀取性能,引入了預讀機制,就是當從磁盤上加載一個數據頁的時候,他可能會連帶著把這個數據頁相鄰的其他數據頁,也加載到緩存里去!
舉個例子,假設現在有兩個空閑緩存頁,然后在加載一個數據頁的時候,連帶著把他的一個相鄰的數據頁也加載到緩存里去了,正好每個數據頁放入一個空閑緩存頁!但是接下來呢,實際上只有一個緩存頁是被訪問了,另外一個通過預讀機制加載的緩存頁,其實并沒有人訪問,此時這兩個緩存頁可都在LRU鏈表的前面。

我們可以看到,這個圖里很清晰的表明了,前兩個緩存頁都是剛加載進來的,但是此時第二個緩存頁是通過預讀機制捎帶著加載進來的,他也放到了鏈表的前面,但是他實際沒人訪問他。除了第二個緩存頁之外,第一個緩存頁,以及尾巴上兩個緩存頁,都是一直有人訪問的那種緩存頁,只不過上圖代表的是剛剛把頭部兩個緩存頁加載進來的時候的一個LRU鏈表當時的情況。

哪些場景會導致預讀呢?

(1)有一個參數是innodb_read_ahead_threshold,他的默認值是56,意思就是如果順序的訪問了一個區里的多個數據頁,訪問的數據頁的數量超過了這個閾值,此時就會觸發預讀機制,把下一個相鄰區中的所有數據頁都加載到緩存里去。
(2)如果Buffer Pool里緩存了一個區里的13個連續的數據頁,而且這些數據頁都是比較頻繁會被訪問的,此時就會直接觸發預讀機制,把這個區里的其他的數據頁都加載到緩存里去。

這個機制是通過參數innodb_random_read_ahead來控制的,他默認是OFF,也就是這個規則是關閉的。

(3)接著我們講另外一種可能導致頻繁被訪問的緩存頁被淘汰的場景,那就是全表掃描。

這個所謂的全表掃描,意思就是類似如下的SQL語句:SELECT * FROM USERS,此時他沒加任何一個where條件,會導致他直接一下子把這個表里所有的數據頁,都從磁盤加載到Buffer Pool里去。這個時候他可能會一下子就把這個表的所有數據頁都一一裝入各個緩存頁里去!此時可能LRU鏈表中排在前面的一大串緩存頁,都是全表掃描加載進來的緩存頁!那么如果這次全表掃描過后,后續幾乎沒用到這個表里的數據呢?此時LRU鏈表的尾部,可能全部都是之前一直被頻繁訪問的那些緩存頁!然后當你要淘汰掉一些緩存頁騰出空間的時候,就會把LRU鏈表尾部一直被頻繁訪問的緩存頁給淘汰掉了,而留下了之前全表掃描加載進來的大量的不經常訪問的緩存頁。

7. 解決預讀帶來的問題

所以為了解決上一講我們說的簡單的LRU鏈表的問題,真正MySQL在設計LRU鏈表的時候,采取的實際上是冷熱數據分離的思想。
所以真正的LRU鏈表,會被拆分為兩個部分,一部分是熱數據,一部分是冷數據,這個冷熱數據的比例是由innodb_old_blocks_pct參數控制的,他默認是37,也就是說冷數據占比37%。

第一次被加載了數據的緩存頁,都會不停的移動到冷數據區域的鏈表頭部。冷數據區域的緩存頁什么時候會放到熱數據區域呢?實際上肯定很多人會想,只要對冷數據區域的緩存頁進行了一次訪問,就立馬把這個緩存頁放到熱數據區域的頭部行不行呢?

其實這也是不合理的,如果你剛加載了一個數據頁到那個緩存頁,他是在冷數據區域的鏈表頭部,然后立馬(在1ms以內)就訪問了一下這個緩存頁,之后就再也不訪問他了呢?難道這種情況你也要把那個緩存頁放到熱數據區域的頭部嗎?

所以MySQL設定了一個規則,他設計了一個innodb_old_blocks_time參數,默認值1000,也就是1000毫秒。也就是說,必須是一個數據頁被加載到緩存頁之后,在1s之后,你訪問這個緩存頁,他才會被挪動到熱數據區域的鏈表頭部去。因為假設你加載了一個數據頁到緩存去,然后過了1s之后你還訪問了這個緩存頁,說明你后續很可能會經常要訪問它,這個時間限制就是1s,因此只有1s后你訪問了這個緩存頁,他才會給你把緩存頁放到熱數據區域的鏈表頭部去。

該思想通過冷熱分離+時間訪問限制,解決了誤淘汰熱數據的問題。吸收冷熱隔離思想,結合項目場景,可以優化緩存中的冷熱數據。

LRU鏈表的熱數據區域是如何進行優化的呢?

熱數據區域里的緩存頁可能是經常被訪問的,所以這么頻繁的進行移動是不是性能也并不是太好?也沒這個必要。

所以說,LRU鏈表的熱數據區域的訪問規則被優化了一下,即你只有在熱數據區域的后3/4部分的緩存頁被訪問了,才會給你移動到鏈表頭部去。如果你是熱數據區域的前面1/4的緩存頁被訪問,他是不會移動到鏈表頭部去的。舉個例子,假設熱數據區域的鏈表里有100個緩存頁,那么排在前面的25個緩存頁,他即使被訪問了,也不會移動到鏈表頭部去的。但是對于排在后面的75個緩存頁,他只要被訪問,就會移動到鏈表頭部去。這樣的話,他就可以盡可能的減少鏈表中的節點移動了。

8. 總結

本節主要講了三鏈表的作用,free鏈表記錄空閑緩存頁,flush鏈表記錄臟頁,即待刷盤緩存頁,當free鏈表沒有空閑時,lru鏈表淘汰最近不常用的緩存頁。三鏈表動態執行過程可以表述為:free鏈表移除結點,lru鏈表冷數據區頭部加入該節點;如果修改了緩存頁,flush加入這個臟頁,lru表中還可能會從冷數據區域移動到熱數據區域的頭部去;如果查詢了緩存頁,會把這個緩存頁在lru鏈表中移動到熱數據區域去,或者在熱數據區域中也有可能會移動到頭部去。總之,要么free鏈表移除節點,flush鏈表加節點,lru鏈表移動節點;要么free加節點,flush減節點,lru減節點。

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2022-03-22 15:05:15

MySQL緩沖池

2019-06-24 05:05:40

緩沖池查詢數據InnoDB

2025-10-30 08:00:00

2021-03-01 18:37:15

MySQL存儲數據

2024-10-23 08:47:46

2022-03-30 09:23:15

MySQL緩沖

2024-07-17 09:10:27

2022-10-12 08:52:00

內存緩沖管理

2023-05-03 21:34:34

MySQL狀態變量

2021-11-29 09:38:12

設計模式對象池模式Object Pool

2022-03-26 08:49:13

MySQL數據存儲

2011-08-30 12:51:19

MySQL線程緩沖池

2019-06-26 06:31:56

緩沖緩沖池查詢數據

2010-05-07 19:15:18

Oracle flas

2025-04-08 08:20:00

2011-07-26 15:30:32

jQuery

2022-05-13 09:02:34

LinuxBufferCache

2025-10-29 07:10:00

2011-06-07 08:58:31

javascript

2010-05-05 17:45:12

IBM Unix
點贊
收藏

51CTO技術棧公眾號

亚洲精品久久7777777| 久久久777精品电影网影网| 亚洲精品自拍视频| 爱久久·www| 亚洲乱码国产乱码精品精98午夜| 国产伦精品免费视频| 一区二区三区性视频| 日韩一级欧洲| 黄色国产精品视频| 欧美性猛片xxxx免费看久爱| 欧美精品资源| 亚洲综合中文字幕在线| 99精品国产99久久久久久白柏| 国产在线色视频| 久久久久久久激情视频| 久久久久国产精品一区二区 | 粉嫩高潮美女一区二区三区| 亚洲热app| 欧美激情喷水视频| 久久超碰97中文字幕| 男女视频在线观看免费| 欧美丰满少妇xxxxx做受| 日本视频免费一区| 国产一级片在线| 国产激情视频一区| 国产丝袜在线精品| 性欧美超级视频| 麻豆亚洲一区| 欧美午夜女人视频在线| 欧美激情久久久久久久久久久| 国产资源第一页| 日韩一区二区在线播放| 欧美日韩三级| 最近97中文超碰在线| 国内精品视频在线| 成人免费精品视频| 特黄毛片在线观看| 久久综合九色欧美狠狠| 91久久精品网| 欧洲杯半决赛直播| fc2ppv完全颜出在线播放| 色综合男人天堂| 97国产一区二区| 久久亚洲精品中文字幕| 国产freexxxx性播放麻豆| 亚洲精品久久久久| 美女网站色91| 538在线观看| 青娱乐一区二区| 欧美日韩国产a| 亚洲国产99| 欧美videos极品另类| 国产欧美日本在线| 欧美亚洲日本一区| 亚洲先锋成人| 麻豆视频在线| 欧美一级片免费观看| 日韩欧美在线一区二区三区| 亚洲激情婷婷| av网址在线看| 亚洲精品一区二区毛豆| 日韩精品视频在线观看网址| 七七婷婷婷婷精品国产| 川上优av中文字幕一区二区| 国产大尺度在线观看| 国产视频精品xxxx| 国产老妇另类xxxxx| 亚洲成av在线| 蜜臀av午夜一区二区三区| 欧美成人激情视频免费观看| 国产精品理论片| 欧美精品一区二区久久| 自拍av在线| 国内精品视频免费| 亚洲国内精品视频| 成人爽a毛片一区二区免费| 国产69精品久久久久按摩| 播放灌醉水嫩大学生国内精品| 久久久久中文字幕2018| 亚洲一二三区在线观看| 黄色亚洲免费| 超碰97国产精品人人cao| 日本a级片在线播放| 欧美成人免费视频| 亚洲影视在线观看| 在线欧美一区| 精品丝袜在线| 国产69精品久久久久久久| 久久久久久久久久久久av| 亚洲精品视频免费看| 国产精品大片| a级片在线免费观看| 国产成人精品无码播放| 日本免费一区二区三区视频观看| 日韩欧美主播在线| 麻豆国产精品视频| 99香蕉久久| 成人在线观看黄色| 免费看欧美黑人毛片| 日韩av理论片| 日韩免费高清视频| 91毛片在线观看| 亚洲成av人电影| 成人影院av| 日日噜噜噜夜夜爽爽狠狠视频 | 成人美女视频在线观看| 看全色黄大色大片免费久久久| 一级视频在线免费观看| 日本一区二区不卡高清更新| 最好看的2019年中文视频| 亚洲日本在线a| 亚洲一区欧美激情| 精品国产不卡一区二区| 国产黄色片在线观看| 久久手机在线视频| 国产精品美女无圣光视频| 日韩欧美激情在线| 国产精品丝袜在线| 老司机久久99久久精品播放免费| 国产成人久久精品一区二区三区| 免费黄色片在线观看| 国产极品在线视频| 国产精品成人一区二区三区| 色妞欧美日韩在线| 91黄色免费网站| 国产欧美一区二区精品秋霞影院| 亚洲日本激情| 国产欧美三级电影| 高清精品在线| 夜色福利资源站www国产在线视频 夜色资源站国产www在线视频 | 凹凸国产熟女精品视频| 成人xxxxx色| 久99久在线视频| 91精品国产福利| 亚洲天堂a在线| 国产aⅴ综合色| 在线精品在线| 亚洲品质自拍| 成人综合网站| 色婷婷视频在线观看| 欧美xx网站| 97国产精东麻豆人妻电影| 久久av一区二区| 秋霞av国产精品一区| 亚洲一区www| 91精品国产欧美日韩| 亚洲一区二区三区自拍| 99久久99久久精品国产片果冻| 亚洲黄色av| 亚洲精品456| 日韩专区视频| 美女av在线免费看| av播放在线| 天天干夜夜干| 日韩欧美在线免费观看视频| 一区二区精品国产| 国产精品污www一区二区三区| 欧美一级电影久久| 欧美成人午夜激情视频| 日韩久久午夜影院| 欧美va日韩va| 91麻豆精品国产91久久久更新时间| 亚洲va欧美va人人爽| 国产精品理伦片| 99久久精品一区| 久久精品国产精品亚洲综合| 欧美激情1区2区| 欧美黄色录像片| 欧美激情15p| 91嫩草精品| 日韩中文字幕无砖| 九九热这里有精品| 免费视频观看成人| 国产极品嫩模在线观看91精品| 在线手机中文字幕| 欧美伦理91| a一区二区三区| 国产精品迅雷| 日韩精品专区| 精品免费av一区二区三区 | 成人精品网站在线观看| 日韩美女视频在线观看| 久久久久久久成人| 欧美国产日本在线| 精品中文字幕在线观看| 精品国产区一区二区三区在线观看| 亚洲视频欧洲视频| 亚洲天堂网在线观看| 亚洲色图日韩av| 中文字幕日韩在线观看| 中文字幕精品www乱入免费视频| 亚洲香蕉成人av网站在线观看| 亚洲美腿欧美激情另类| 亚洲午夜色婷婷在线| 最好看的2019年中文视频| 久久色免费在线视频| 国语自产精品视频在线看一大j8| 国内精品久久久久久影视8| 日产精品久久久一区二区福利| 国产精品成人播放|