天天看点

理解innodb buffer pool

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使用监控

理解innodb 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>

继续阅读