mysql内存体系结构_Innodb存储引擎的体系架构之内存
Inndo中緩沖池存在的主要目的是,減少數據庫與磁盤的交互。進程通過內存讀寫數據的速度遠遠快于磁盤。
Innodb內存結構主要由兩部分組成redo_log_buffer和緩沖池,redo_log_buffer作用以后在事務的持久性部分進行展開,今天主要講緩沖池。
緩沖池
緩沖池的大小會直接影響Innodb數據庫的性能,一般生產級別的mysql服務器都會將緩沖池設置為操作系統總內存的3/4,緩沖池主要由四部分組成:
數據頁
索引頁
change buffer
自適應hash索引
數據頁
數據頁就是緩存真實數據的頁,在innodb中數據頁是主鍵所在聚集索引構成的B+Tree數據結構,所以這個數據頁既包含索引又包含數據。
索引頁
索引頁就是緩存數據索引的頁,這里的索引頁代表的是二級索引(非聚集索引)構成的B+Tree數據結構,這個索引包含索引的數據以及數據對一個的主鍵id
Change Buffer
通過詞義就可以知道Buffer是緩沖的意思,一般和Buffer有關的都在內存中。所以Change Buffer在緩沖池扮演的角色就是緩沖不在緩沖池數據的更新(Insert、Update、Delete)。
為什么需要Change Buffer:
如果修改的數據在緩沖池中,無論是查詢和更新都不需要產生隨機IO.
但是如果修改的數據不在緩沖池中,那么就需要將數據讀取到緩存池中然后再進行更新,這樣就會產生隨機IO
Change Buffer的作用就是,不在緩沖池的數據不直接讀取磁盤數據,而是將修改的數據保存在Change Buffer中,Master Thread定期同步臟頁,或者等到真正查詢的時候再產生磁盤IO
Change Buffer默認占用Innodb_buffer_pool1/4的容量,最大可以設置為1/2,通過innodb_change_buffer_max_size進行設置。
這里有幾個問題:
Change Buffer如何保證持久性
Change Buffer也會將數據寫入到redo log中,通過redo log保證數據的可靠性.
Change Buffer適用的索引類型
僅適用于非唯一索引,因為唯一索引需要有唯一性驗證,如果需要唯一性驗證就無法避免從磁盤中讀取數據,所以僅適用于非唯一索引。
Change Buffer適用的場景
非唯一性索引多
寫多讀少
寫完就讀的場景叫少的情況
自適應hash索引
Innodb本身不支持用戶自己設定索引為hash索引,但是會根據條件生成自適應hash索引
因為b+tree可以有效地支持范圍查詢,但是hash索引遇到范圍查詢因為本身無序的特征就無能為力了
Innodb默認開啟自適應hash索引,當數據訪問次數超過總行數的1/16后添加到hash索引中
hash索引的key是索引的前綴,如字段的前綴,value是索引鎖在頁的位置。
通過上圖可以明顯看的出來,hash索引查詢的層數更少一些。
通過參數innodb_adaptive_hash_index來設置參數,默認為on
名稱自適應哈希索引適合使用場景適合使用 = 和 IN 操作符的等值查詢
不合適場景不適合使用 like 和 % 的范圍查詢
優點提高了Innodb的內存使用率和一些情況下二級索引的查詢效率
缺點占用Innodb的內存緩存
引用
總結
以上是生活随笔為你收集整理的mysql内存体系结构_Innodb存储引擎的体系架构之内存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql中标记某条数据库_一个关系数据
- 下一篇: mysql 事务关联_MySQL 关联、