標籤:
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緩衝池預熱的狀態資訊。
MySql-InnoDB-緩衝管理