MYSQL快取池筆記整理

2021-10-17 08:42:21 字數 1457 閱讀 1004

**mysql的innodb引擎是基於磁碟儲存的,管理方式也是按照頁管理的,表空間結構大概如下:

如果所有的請求都需要磁碟io的話,那無疑是很耗時的,所以在中間就有一層快取來進行緩衝,mysql的快取池就是這個緩衝的角色,通過快取池可以彌補部分cpu和磁碟的速度差距。

讀操作如果資料是首次讀,那麼按頁讀取後會將磁碟讀出來頁的資料存到快取池,這樣如果下次獲取相同的頁時,就不會區磁碟讀取,而直接返回快取池中的資料頁。

寫操作要寫資料肯定需要先獲取資料,那麼首先會讀,然後,對要寫的資料並不會直接被寫入到磁碟,而實先修改快取池中的頁,然後根據一定的頻率來將這個髒頁(dirty page)刷到磁碟,這裡又涉及到**checkpoint**機制。

快取池中主要包含了以下部分

快取池中的每個快取頁又包含以下控制資訊,稱為控制塊

快取池的管理

快取池中大部分是資料頁和索引頁,為了管理這些頁,就有free鍊錶,lru鍊錶和flush鍊錶。

mysql服務啟動時,buffer pool初始化,buffer pool被劃分為控制塊和快取塊,此時這些快取頁是空的,隨著服務的使用,不斷會有磁碟資料頁被刷到快取中,為了記錄哪些是快取頁使用了的,哪些快取頁是空閒的,在一開始,就將這些快取頁的控制單元記錄到free鍊錶中,這樣就可以通過free鍊錶來管理快取頁,當需要使用快取頁時,從free鍊錶申請空閒的快取頁,然後讓lru鍊錶的節點記錄該頁的控制單元資訊,這樣,就將使用的和空閒的分開來,同時,合理的淘汰掉不常用的快取頁,將空頁還給free鍊錶;對於寫請求造成的髒頁,會在乙個flush鍊錶中記錄它的資訊,不同的是,flush鍊錶記錄的是它在lru鍊錶的資訊,這樣就可以最終找到髒頁,再把髒頁刷到磁碟。

mysql在做全表掃瞄時,在server層是這麼執行的

對執行層返回的結果整合成結果集,傳送到mysql的net-buffer,

net-buffer滿了以後如果引擎層還沒查詢完成,net-server就會呼叫網路介面傳送資料到客戶端,然後清空net-buffer,來接收後續的結果。

如果傳送函式返回 eagain 或 wsaewouldblock,就表示本地網路棧(socket send buffer)寫滿了,進入等待。直到網路棧重新可寫,再繼續傳送。

在innodb執行引擎層記憶體頁是受buffer-pool管理的,對於全表掃瞄這種場景,資料中非熱點資料居多,基本會被放到old,不會影響young的記憶體資料,也就不會使熱點快取頁失效。快取頁置換導致大量磁碟io,從而影響mysql的效能

mysql lru LRU在MySQL快取池的實現

mysql的innodb引擎設定有索引及資料快取池,其中用到的lru演算法來維持快取的命中率 這裡用到了順序表list來作為緩衝池,每個資料節點稱為block 該演算法採用 中點插入法 當插入乙個新block時,移除表尾最近最少使用的block,在中點插入新block。這個中點將鍊錶分為兩部分 1....

LRU在MySQL快取池的實現

mysql的innodb引擎設定有索引及資料快取池,其中用到的lru演算法來維持快取的命中率 這裡用到了順序表list來作為緩衝池,每個資料節點稱為block 該演算法採用 中點插入法 當插入乙個新block時,移除表尾最近最少使用的block,在中點插入新block。這個中點將鍊錶分為兩部分 1....

MYSQL筆記(MySQL查詢快取)

查詢快取儲存了完整的select結果集 這樣當乙個相同的查詢到達時,可伺服器可以跳過解析 優化 執行等階段,直接把結果返回給客戶端,但某種意義上講,查詢快取實際上修改了應用程式請求的語義,例如,即使在lock tables的情況下,查詢也能被快取下來。在伺服器端維護了乙個查詢表,查詢的鍵是查詢文字 ...