mysql Innodb缓存命中率
更新日期:
最近看服务器log发现有不少数据库操作超时的情况,有时候处理一个sql操作需要一两秒的时间,这显然是不可接受的。查了下原因,数据库操作太多太频繁压力大是一方面,数据库配置没有优化也有一定的原因。mysql中使用命令show status like ‘Innodb_bufferpool%’;可以查看mysql innodb缓存的一些信息(mysql innodb缓存保存了数据库索引和一些表的数据),如下:
show variables like ‘%innodb_buffer_pool_size%’;
+-----------------------------------+-------+ | Variable_name | Value | +-----------------------------------+-------+ | Innodb_buffer_pool_pages_data | 56 | | Innodb_buffer_pool_pages_dirty | 0 | | Innodb_buffer_pool_pages_flushed | 197 | | Innodb_buffer_pool_pages_free | 455 | | Innodb_buffer_pool_pages_misc | 1 | | Innodb_buffer_pool_pages_total | 512 | | Innodb_buffer_pool_read_ahead_rnd | 3 | | Innodb_buffer_pool_read_ahead_seq | 0 | | Innodb_buffer_pool_read_requests | 7000 | | Innodb_buffer_pool_reads | 31 | | Innodb_buffer_pool_wait_free | 0 | | Innodb_buffer_pool_write_requests | 419 | +-----------------------------------+-------+
(上面非项目数据)
其中,Innodb_buffer_pool_read_requests表示read请求的次数,Innodb_buffer_pool_reads表示从物理磁盘中读取数据的请求次数,所以innodb buffer的read命中率就可以这样得到:(Innodb_buffer_pool_read_requests - Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100%。一般来讲这个命中率不会低于99%,如果低于这个值的话就要考虑加大innodb buffer pool。
另外,Innodb_buffer_pool_pages_total参数表示缓存页面的总数量(一页16k,所以总共8M),Innodb_buffer_pool_pages_data代表有数据的缓存页数,Innodb_buffer_pool_pages_free代表没有使用的缓存页数。如果Innodb_buffer_pool_pages_free偏大的话,证明有很多缓存没有被利用到,这时可以考虑减小缓存,相反Innodb_buffer_pool_pages_data过大就考虑增大缓存。
可以通过show variables like ‘%innodb_buffer_pool_size%’;命令查看当前缓存的大小:+-------------------------+---------+ | Variable_name | Value | +-------------------------+---------+ | innodb_buffer_pool_size | 8388608 | +-------------------------+---------+
默认是8M,一般来讲这个值肯定是不够的,大家通常建议设置为系统内存的50%-80%,但也不是越大越好,要根据具体项目具体分析(操作系统留1G左右,mysql连接数*4M,宿主程序缓存nM)。设置方法,修改/etc/my.cnf文件,并添加字段innodb_buffer_pool_size = 3G,然后重启mysql 服务就ok了。