如果 初始化緩沖池時 innodb_buffer_pool_chunk_size* innodb_buffer_pool_instances大於當前緩沖池大小, innodb_buffer_pool_chunk_size 則截斷為 innodb_buffer_pool_size/ innodb_buffer_pool_instances。
緩沖池大小必須始終等於innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的倍數。如果更改 innodb_buffer_pool_chunk_size, innodb_buffer_pool_size 則會自動舍入為等於innodb_buffer_pool_chunk_size * innodb_buffer_pool_instances的倍數。初始化緩沖池時會進行調整。
舉例說明:
innodb_buffer_pool_size
設置為3G,innodb_buffer_pool_instances
設置為8。innodb_buffer_pool_chunk_size默認值為
128M。
3G是有效的innodb_buffer_pool_size值,因為3G是innodb_buffer_pool_instances = 8 * innodb_buffer_pool_chunk_size = 128M
的倍數
innodb_buffer_pool_size
設置為3G,innodb_buffer_pool_instances
設置為16. innodb_buffer_pool_chunk_size
為128M。
3G不是有效的innodb_buffer_pool_size值,因為3G不是innodb_buffer_pool_instances = 16 * innodb_buffer_pool_chunk_size = 128M
的倍數,可以看出innodb_buffer_pool_size
的值自動調整到4GB。
截斷舉例:
如果緩沖池初始化的大小為2GB
(2147483648字節), 4
緩沖池實例和塊大小1GB
(1073741824字節),則塊大小將截斷為等於innodb_buffer_pool_size
/ 的值innodb_buffer_pool_instances
shell> mysqld --innodb-buffer-pool-size=2147483648 --innodb-buffer-pool-instances=4 --innodb-buffer-pool-chunk-size=1073741824; mysql> SELECT @@innodb_buffer_pool_size; +---------------------------+ | @@innodb_buffer_pool_size | +---------------------------+ | 2147483648 | +---------------------------+ mysql> SELECT @@innodb_buffer_pool_instances; +--------------------------------+ | @@innodb_buffer_pool_instances | +--------------------------------+ | 4 | +--------------------------------+ # Chunk size was set to 1GB (1073741824 bytes) on startup but was # truncated to innodb_buffer_pool_size / innodb_buffer_pool_instances mysql> SELECT @@innodb_buffer_pool_chunk_size; +---------------------------------+ | @@innodb_buffer_pool_chunk_size | +---------------------------------+ | 536870912 | +---------------------------------+
注意:innodb_buffer_pool_chunk_size可以以1MB(1048576字節)為單位增加或減少,但只能在啟動時,命令行字符串或MySQL配置文件中進行修改。為避免潛在的性能問題,塊數(innodb_buffer_pool_size
/ innodb_buffer_pool_chunk_size
)不應超過1000。更改時應小心 innodb_buffer_pool_chunk_size
,因為更改此值可以自動增加緩沖池的大小。在更改之前 innodb_buffer_pool_chunk_size
,請計算它將產生的影響, innodb_buffer_pool_size
以確保生成的緩沖池大小可以接受
在線緩沖池調整內部
調整大小操作由后台線程執行。增加緩沖池的大小時,調整大小操作:
-
添加頁面
chunks
(塊大小定義innodb_buffer_pool_chunk_size
) -
隱藏在內存中使用新地址的哈希表,列表和指針
-
將新頁面添加到空閑列表
當這些操作正在進行時,其他線程將被阻止訪問緩沖池。
減小緩沖池的大小時,調整大小操作:
-
對緩沖池進行碎片整理並撤消(釋放)頁面
-
刪除頁面
chunks
(塊大小定義innodb_buffer_pool_chunk_size
) -
轉換哈希表,列表和指針以在內存中使用新地址
參考:官方文檔:
https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters.html#sysvar_innodb_buffer_pool_chunk_size
https://dev.mysql.com/doc/refman/5.7/en/innodb-buffer-pool-resize.html