InnoDB表、索引以及其他輔助緩衝區的快取資料被儲存在緩衝區中的記憶體區域。緩衝池的大小對於系統效能很重要。更大的緩衝池可以減少磁碟I/O來多次存取相同表資料。緩衝池大小在專用資料庫伺服器上設定為電腦實體記憶體大小的80%是可行的
1)系統變數參數
Innodb_page_size
#InnoDB頁面大小(預設為16KB)。頁面中包含許多值,頁面大小使它們可以輕鬆轉換為位元組。
Innodb_buffer_pool_chunk_size
innodb_buffer_pool_chunk_size 定義InnoDB緩衝池大小調整操作的區塊大小。預設128M。最大值可設定innodb_buffer_pool_size / innodb_buffer_pool_instances
innodb_buffer_pool_instances
InnoDB 緩衝池分割為的區域數。
Innodb_buffer_pool_pages_data
#數頁在 InnoDB 緩衝池中所包含的資料。該數字包括 髒頁和乾淨頁。使用壓縮表時,報告的 Innodb_buffer_pool_pages_data 值可能大於 Innodb_buffer_pool_pages_total (錯誤#59550)。
Innodb_buffer_pool_pages_total
InnoDB 緩衝池 的總大小(以頁為單位)。使用壓縮表時,報告的Innodb_buffer_pool_pages_data 值可能大於Innodb_buffer_pool_pages_total (錯誤#59550)
2)運行狀態變量
Innodb_buffer_pool_pages_flushed
#從緩衝池重新整理頁面的請求數。
Innodb_buffer_pool_read_requests
表示從記憶體讀取邏輯的請求數。
Innodb_buffer_pool_reads
#InnoDB 無法從緩衝池滿足的邏輯讀取的數量,必須直接從磁碟讀取。
Innodb_buffer_pool_wait_free
#通常,對InnoDB緩衝池的寫入是在後台進行的。當InnoDB需要讀取或建立頁面而沒有可用的乾淨頁面時,InnoDB會先刷新一些髒頁面並等待該操作完成。此計數器統計這些等待的實例。如果設定正確,innodb_buffer_pool_size應該是一個較小的值。
1、innodb_buffer_pool_size 預設設定係統記憶體百分之80%,後如下規則配合實際狀況調整
mysql> show global status like 'Innodb_buffer_pool_pages_data'; +-------------------------------+---------+ | Variable_name | Value | +-------------------------------+---------+ | Innodb_buffer_pool_pages_data | 1894874 | +-------------------------------+---------+ 1 row in set (0.00 sec) mysql> show global status like 'Innodb_buffer_pool_pages_total'; +--------------------------------+---------+ | Variable_name | Value | +--------------------------------+---------+ | Innodb_buffer_pool_pages_total | 1965960 | +--------------------------------+---------+ 1 row in set (0.00 sec) # 计算是否应该添加内存 使用率 = Innodb_buffer_pool_pages_data/Innodb_buffer_pool_pages_total*100% 当结果 > 95% 则增加 innodb_buffer_pool_size 当结果 < 95% 则减少 innodb_buffer_pool_size, 可适当较少,当然独享业务机器多了也没啥问题
2、innodb_buffer_pool_instances 預設為8,最小1,最大64
對於緩衝池在數千兆位元組範圍內的系統,透過減少爭用不同執行緒讀寫快取頁面的爭用,將緩衝池劃分為多個單獨的實例可以提高並發性。此功能通常用於緩衝池大小在數GB範圍內的系統。使用innodb_buffer_pool_instances 配置選項配置了多個緩衝池實例 ,您也可以調整該innodb_buffer_pool_size值。
許多資料請求可以透過從記憶體中檢索來滿足,特別是在InnoDB緩衝池很大的情況下。您可能會遇到多個執行緒試圖立即存取緩衝池的瓶頸。您可以啟用多個緩衝池以最小化此爭用。使用雜湊函數將每個頁面隨機對應到緩衝池中的一個位置,以儲存或讀取緩衝池中的頁面。每個緩衝池管理自己的空閒列表,刷新列表,LRU和連接到緩衝池的所有其他資料結構,並受其自己的緩衝池互斥量保護。
要啟用多個緩衝池實例,請將innodb_buffer_pool_instances配置選項設為 大於1(預設)的值,最大為64(最大)。此選項僅在將innodb_buffer_pool_size設為1GB或更大時才會生效。您指定的總大小將分配給所有緩衝池。為了獲得最佳效率,指定的組合 innodb_buffer_pool_instances 和innodb_buffer_pool_size,使得每個緩衝池實例至少為1GB。
總結:
# cat /etc/my.cnf [mysqld] ...... innodb_buffer_pool_size = 系统内存%80 innodb_buffer_pool_instances = 大于8的情况下,每个缓冲池实例至少1GB ......
Reference:
https://dev.mysql.com/doc/refman/5.7/en/innodb-parameters .html
https://dev.mysql.com/doc/refman/5.7/en/server-status-variables.htm
对于繁忙的服务器, buffer pool 将划分为多个实例以提高系统并发性, 减少线程间读写缓存的争用。buffer pool 的大小首先受 innodb_buffer_pool_instances 影响, 当然影响较小。
1.Innodb_buffer_pool_pages_data: Innodb buffer pool缓存池中包含数据的页的数目,包括脏页。单位是page。
show global status like 'Innodb_buffer_pool_pages_data';
2.Innodb_buffer_pool_pages_total: innodb buffer pool的页总数目。单位是page。
show global status like 'Innodb_buffer_pool_pages_total';
3.show global status like 'Innodb_page_size'; 查看@@innodb_buffer_pool_size大小,单位字节
SELECT @@innodb_buffer_pool_size/1024/1024/1024; #字节转为G
4.在线调整InnoDB缓冲池大小,如果不设置,默认为128M
set global innodb_buffer_pool_size = 4227858432; ##单位字节
计算Innodb_buffer_pool_pages_data/Innodb_buffer_pool_pages_total*100%
当结果 > 95% 则增加 innodb_buffer_pool_size, 建议使用物理内存的 75%
当结果 < 95% 则减少 innodb_buffer_pool_size, 建议设置大小为: Innodb_buffer_pool_pages_data * Innodb_page_size * 1.05 / (1024*1024*1024)
以上是MySQL之Innodb_buffer_pool_size怎麼設定的詳細內容。更多資訊請關注PHP中文網其他相關文章!