<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
當我們想更新某條資料的時候,難道是從磁碟中載入出來這條資料,更新後再持久化到磁碟中嗎?
如果這樣搞的話,那一條sql的執行過程可太慢了,因為對一個大磁碟檔案的讀寫操作是要耗費幾百萬毫秒的
真實的執行過程是,當我們想更新或者讀取某條資料的時候,會把對應的頁載入到Buffer Pool緩衝池中(Buffer Pool本質上就是一塊連續的記憶體空間)
預設為128m,當然為了提高系統的並行度,你可以把這個值設大一點
之所以載入頁到Buffer Pool中,是考慮到當你使用這個頁的資料時,這個頁的其他資料使用到的概率頁很大,隨機IO的耗時很長,所以多載入一點資料到Buffer Pool
Buffer Pool中主要分為2部分,快取頁和描述資料,MySQL從磁碟載入的資料頁會放入快取頁中
對於每個快取頁都有對應的描述資訊,比如資料頁所屬於表空間,資料頁的編號等
Buffer Pool中的描述資料大概相當於快取頁大小的5%左右,這部分記憶體是不包含在Buffer Pool中的
當更新資料的時候,如果對應的頁在Buffer Pool中,則直接更新Buffer Pool中的頁即可,對應的頁不在Buffer Pool中時,才會從磁碟載入對應的頁到Buffer Pool,然後再更新,此時Buffer Pool中的頁和磁碟中的頁資料是不一致的,被稱為髒頁。這些髒頁是要被刷回到磁碟中的
這些髒頁是多會刷回到磁碟中的? 有如下幾個時機
Buffer Pool不夠用了,要給新載入的頁騰位置了,所以會利用改進的後的LRU演演算法,將一些髒頁刷回磁碟後臺執行緒會在MySQL不繁忙的時候,將髒頁刷到磁碟中redolog寫滿時(redolog的作用後面會提到)資料庫關閉時會將所有髒頁刷回到磁碟
這樣搞,效率是不是高很多了?
當需要更新的資料所在的頁已經在Buffer Pool中時,只需要操作記憶體即可,效率不是一般的高
我們怎麼知道哪些快取頁是空閒的?
MySQL為Buffer Pool設計了一個free連結串列,它是一個雙向連結串列,每個節點就是一個空閒快取頁的描述資料
我們如何知道快取頁是否被載入到記憶體了?
很簡單啊,建立一個雜湊表不就行了,key為表空間號+頁號,value為對應的快取頁
當把資料頁讀取到快取頁的時候,對應的描述資料會從free連結串列放到flush連結串列
當不停的把磁碟上的資料頁載入到快取頁,free連結串列不停的移除空閒快取頁,當free連結串列上沒有空閒快取頁,當你還要載入資料頁到快取頁時,該怎麼辦呢?
如果要淘汰一些資料,該淘汰誰呢?
引入LRU連結串列來判斷哪些快取頁是不常用的?
快取淘汰策略在很多中介軟體中會被用到,其中用的最多的就是LRU演演算法,當每存取一個快取頁的時候就把快取頁移到連結串列的頭部
我們只需要把連結串列尾部的快取頁刷到記憶體中,然後載入新的資料頁即可。
這樣的方式看似很完美,但是在實際執行過程中會存在巨大的隱患
首先就是mysql的預讀,
哪些情況會觸發MySQL的預讀
當發生全表掃描的時候(比如 select * from users),會導致表裡的資料頁都載入到 Buffer Pool 中去。這樣有可能導致LRU連結串列前面一大串資料頁都是全表掃描載入進來的資料頁,但是如果這次全表掃描過後後續幾乎沒用到這個表裡面的資料呢?
這樣就會導致經常被掃描的快取頁被淘汰了,留下的都是全表掃描載入進來的快取頁
為了解決這個問題,LRU連結串列改進了一下,採用了冷熱分離的思想。
即LRU連結串列會被拆分為2部分,一部分是冷資料,一部分是熱資料
當資料頁第一次被載入到快取的時候,快取頁會被放到冷資料區域的連結串列頭部。
那麼冷資料區的快取頁多會放到熱資料區呢?
你可能會想,當冷資料區的快取頁再次被存取時,就放到熱資料區可以不?
mysql> SHOW VARIABLES LIKE 'innodb_old_blocks_pct'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_old_blocks_pct | 37 | +-----------------------+-------+ 1 row in set (0.02 sec)
當多執行緒存取Buffer Pool中的各種連結串列時,需要加鎖保證執行緒安全,影響請求的處理速度,此時我們就可以將Buffer Pool分為多個,多執行緒存取事不會互相影響,提高了請求的處理速度
在MySQL 5.7.5之前,Buffer Pool不能動態擴充套件,動態擴充套件。為了增加動態擴充套件就增加了chunk機制,有興趣的小夥伴可以看看其他資料,就不多做分析了
學習了這麼多理論知識,那麼Buffer Pool應該調多大呢?
執行如下命令可以得到Buffer Pool的大小,名字,以及chunk的大小
SHOW VARIABLES LIKE '%innodb_buffer%'
innodb_buffer_pool_size的單位是位元組,我們轉成MB來看一下,預設是128M
-- 128m SELECT @@innodb_buffer_pool_size / 1024 / 1024
執行如下命令可以得到buffer_pool的當前使用狀態
SHOW STATUS LIKE '%buffer_pool%';
我們挑一些重要的引數來分析一下
Buffer Pool 讀快取命中率:
(Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / (Innodb_buffer_pool_read_requests) *100%
Buffer Pool 髒頁比率:
Innodb_buffer_pool_pages_dirty / (Innodb_buffer_pool_pages_data)*100%
Buffer Pool 使用率:
innodb_buffer_pool_pages_data / ( innodb_buffer_pool_pages_data + innodb_buffer_pool_pages_free ) * 100%
快取命中率比較低可以增大Buffer Pool的大小
使用率比較高時可以增大Buffer Pool的大小
你也可以執行如下命令獲取一些關於Buffer Pool的其他引數,本篇文章就不多做介紹了
show engine innodb status;
[1]https://www.cnblogs.com/FengGeBlog/p/10283095.html
[2]https://m.starcto.com/mysql/128.html
到此這篇關於MySQL Buffer Pool如何提高頁的存取速度的文章就介紹到這了,更多相關MySQL Buffer Pool存取速度內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45