mysql Innodb缓存命中率

来源:互联网 发布:质量管理体系数据分析 编辑:程序博客网 时间:2024/05/21 08:00

        最近看服务器log发现有不少数据库操作超时的情况,有时候处理一个sql操作需要一两秒的时间,这显然是不可接受的。查了下原因,数据库操作太多太频繁压力大是一方面,数据库配置没有优化也有一定的原因。mysql中使用命令show status like  'Innodb_buffer_pool_%';可以查看mysql innodb缓存的一些信息(mysql innodb缓存保存了数据库索引和一些表的数据),如下:

+-----------------------------------+-------+| 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了。

0 0
原创粉丝点击