MySql-InnoDB-緩存管理

MySql內存結構
這裏寫圖片描述

InnoDB主索引是聚簇索引,索引與數據共用表空間,對於InnoDB而言,數據就是索引,索引就是數據。InnoDB緩存機制和MyISAM緩存機制的最大區別就是在於,InnoDB不僅僅是緩存索引,還會緩存數據。

InnoDB緩存池
InnoDB緩存池(InnoDB buffer pool)是InnoDB性能提升的核心,它既可以緩存數據還可以緩存索引,甚至其他管理數據(例如元數據信息,行級鎖信息)。

使用MySQL命令”show variables like ‘innodb%pool%’;“可以查看InnoDB緩存池的相關參數信息。
這裏寫圖片描述
InnoDB_buffer_pool_size:用於設置InnoDB緩存池(InnoDB_buffer_pool)的大小。
InnoDB緩存池的大小對InnoDB整體性能影響較大,如果當前的MySQL服務器專門用於提供MySQL服務,應儘量增加InnoDB_buffer_pool_size的大小,把頻繁訪問的數據都放到內存中來,儘可能減少InnoDB對硬盤的訪問,爭取將InnoDB最大化成爲一個內存型存儲索引的訪問,爭取將InnoDB最大化成爲一個內存存儲引擎。

InnoDB_buffer_pool_instances:默認值是1,表示InnoDB緩存池被劃分到一個區域。適當地增加該參數(例如將該參數值設置爲2),此時InnoDB被劃分成爲兩個區域,可以提升InnoDB的併發性能。如果InnoDB緩存池被劃分成多個區域,建議每個區域不小於1GB的空間。

InnoDB_additional_mem_pool_size:指定InnoDB用來存儲數據字典和其他內部數據結構的緩存大小,默認值是2MB。InnoDB表的個數越多,該參數的值就應該設置得越大;當InnoDB用完緩存空間時,InnoDB就會操作系統申請內存空間,並向錯誤日誌寫入一條警告信息。

InnoDB緩存池內部結構
InnoDB在內存中維護一個緩存池用於緩存數據和索引。緩存池可以被認爲一條長LRU鏈表,該鏈表又分爲2個子鏈表,一個子鏈表存放old pages(裏面存放的是長時間未被訪問的數據頁),另一個子鏈接存放new pages(裏面存放的是最近被訪問的數據頁面)。其餘爲new pages佔用,如圖下圖所示。靠近LRU鏈表頭部的數據頁表示最近被訪問,靠近LRU鏈表尾部的數據頁表示長時間未被訪問,而這兩個部分交匯處成爲midpoint
這裏寫圖片描述

當用戶需要訪問數據時,InnoDB首先會在InnoDB緩衝池查找數據,如果緩衝池中沒有數據時,InnoDB會將硬盤上的數據塊插入到InnoDB緩存池中;如果InnoDB緩衝池已滿,InnoDB通過LRU算法清楚InnoDB緩存池中個別數據塊。每當有新數據塊需要加載到InnoDB緩衝池中時,該數據塊應變爲‘數據頁’被插到midpoint的位置,並聲明爲old數據頁。那麼old數據頁什麼時候能移動到new Page鏈表中呢?

(1)當InnoDB_old_blocks_time的參數值設置爲0時。當old部分的數據頁被訪問到時,該數據頁會被提升到鏈表的頭部,並被標記爲new數據頁。
(2)當InnoDB_old_blocks_time的參數值大於0時(以1000毫秒或者1秒爲例)。old部分數據頁插入緩衝池後,1秒之後被訪問,該數據頁會被提升到鏈表的頭部,並被標記爲new數據頁。在剛插入到一秒內,即便old部分的數據頁被訪問,該數據頁也不會移動到new鏈表的頭部。

使用MySQL命令show variables like ‘innodb_old%’;可以查看InnoDB緩衝池結構的參數信息。
這裏寫圖片描述
innodb_old_blocks_pct:控制old page子鏈表在LRU鏈表中的長度。
innodb_old_blocks_time:控制old page子鏈表的數據頁移動到new page 子鏈表中的時機。

InnoDB緩存池預熱
MySQL服務啓動一段時間後,InnoDB會將經常訪問的數據(包括業務數據,管理數據)置入InnoDB緩衝池中,即InnoDB緩衝池保存的是頻繁訪問的數據(簡稱熱數據)。當InnoDB緩衝池的大小是幾十GB甚至是幾百GB時,由於某些原因(例如數據庫定期維護)重啓MySQL服務,如何將之前InnoDB緩衝池中的熱數據重新加載到InnoDB緩衝池中?簡單地說:如何對InnoDB緩衝池進行預熱,以便於MySQL服務器快速地恢復到重啓MySQL服務之前的性能狀態?

從5.6版本開始,MySQL支持關閉MySQL服務時將內存中的熱數據保存到硬盤,MySQL重啓後首先將硬盤中的如數據加載到InnoDB緩衝池中,以便縮短warmup進程的時間,提高業務繁忙高併發時的效率。使用MySQL命令show variables like ‘%innodb%pool%’;‘可以查看有關InnoDB緩衝池預熱功能參數設置。
這裏寫圖片描述

innodb_buffer_dump_at_shutdown:默認爲關閉OFF。如果開啓該參數,停止MySQL服務時,InnoDB將InnoDB緩衝池中的熱數據保存到本地硬盤。
innodb_buffer_pool_load_at_startup:默認爲關閉OFF。如果開啓該參數,啓動MySQL服務時,MySQL將本地熱數據加載到InnoDB緩衝池中。
innodb_buffer_pool_load_now:默認爲關閉OFF。如果開啓該參數,停止MySQL服務時,以手動方式將InnoDB緩存池中的熱數據保存到本地硬盤。
innodb_buffer_pool_filename:如果開啓InnoDB預熱功能,停止MySQL服務時,MySQL將InnoDB緩衝池中的熱數據保存到數據庫根目錄中,默認文件名爲ib_buffer_pool.
innodb_buffer_pool_load_aborr:默認爲關閉OFF。如果開啓該參數,即便開啓InnoDB預熱功能,啓動MySQL服務室,MySQL也不會將本地硬盤的熱數據加載到InnoDB緩衝池中。

開啓InnoDB緩衝池預熱後,使用MySQL命令‘show variables like ‘Innodb_buffer%’;”可以查看InnoDB緩衝池預熱的狀態信息。
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章