innodb buffer pool有幾個目的:
緩存資料--衆所周知,這個占了buffer pool的大半空間
緩存目錄--資料字典
insert buffer
排序的内部結構--比如自适應hash的結構或者一些行鎖
idxfrac這個值越低越好,舉個例子,表裡隻有一個唯一索引的資料如下:
可見idxfrac可見這個值越低越好。
從這裡可以看到資料和索引占了buffer pool的大部分空間。也可以看出來這裡有幾種重要的頁類型:
INDEX: B-Tree index
IBUF_INDEX: Insert buffer index
UNKNOWN: not allocated / unknown state
TRX_SYSTEM: transaction system data
一個典型的buffer pool使用監控

從這裡圖裡我們可以看到buffer pool幾乎是被填滿的,另外預留了10%的空間用來做其他用途。
一般怎麼設定buffer pool大小呢?
在InnoDB上面執行select語句:
對于聚簇索引來說,大多數情況通過SELECT COUNT(*) 加載到buffer pool中了。
對于二級索引來說,要執行一些簡單的語句來抓取全部資料,比如select from tbname where 索引的第一列。或者select from tbname force index(二級索引) where colname <>0.
另外,MySQL5.7支援動态修改buffer pool:
在MySQL (5.6+), Percona Server (5.5.10+) or MariaDB (10.0+)可以通過以下配置把buffer pool裡面的資料dump出來,并在啟動的時候加載到記憶體中:
<a href="https://michael.bouvy.net/blog/en/2015/01/18/understanding-mysql-innodb-buffer-pool-size/">https://michael.bouvy.net/blog/en/2015/01/18/understanding-mysql-innodb-buffer-pool-size/</a>
<a href="http://www.speedemy.com/mysql/17-key-mysql-config-file-settings/innodb_buffer_pool_size/">http://www.speedemy.com/mysql/17-key-mysql-config-file-settings/innodb_buffer_pool_size/</a>