我们在前面的数据库查询流程里,提到了进了innodb之后,会有一层内存buffer pool,用于将磁盘数据页加载到内存页中,只要查询到buffer pool里有,就可以直接返回,否则就要走磁盘IO,那就慢了 。
也就是说,如果我的buffer pool 越大,那我们能放的数据页就越多,相应的,sql查询时就更可能命中buffer pool,那查询速度自然就更快了 。
可以通过下面的命令查询到buffer pool的大小,单位是Byte 。
mysql> show global variables like 'innodb_buffer_pool_size';+-------------------------+-----------+| Variable_name| Value|+-------------------------+-----------+| innodb_buffer_pool_size | 134217728 |+-------------------------+-----------+1 row in set (0.01 sec)
也就是128Mb 。
如果想要调大一点 。可以执行:
mysql> set global innodb_buffer_pool_size = 536870912;Query OK, 0 rows affected (0.01 sec)mysql> show global variables like 'innodb_buffer_pool_size';+-------------------------+-----------+| Variable_name| Value|+-------------------------+-----------+| innodb_buffer_pool_size | 536870912 |+-------------------------+-----------+1 row in set (0.01 sec)
这样就把buffer pool增大到512Mb了 。
但是吧,如果buffer pool大小正常,只是别的原因导致的查询变慢,那改buffer pool毫无意义 。
但问题又来了 。
怎么知道buffer pool是不是太小了?
这个我们可以看buffer pool的缓存命中率 。

文章插图
查看buffer pool命中率
通过 show status like 'Innodb_buffer_pool_%';可以看到跟buffer pool有关的一些信息 。
Innodb_buffer_pool_read_requests表示读请求的次数 。
Innodb_buffer_pool_reads 表示从物理磁盘中读取数据的请求次数 。
所以buffer pool的命中率就可以这样得到:
buffer pool 命中率 = 1 - (Innodb_buffer_pool_reads/Innodb_buffer_pool_read_requests) * 100% 比如我上面截图里的就是,1 - (405/2278354) = 99.98% 。可以说命中率非常高了 。
一般情况下buffer pool命中率都在99%以上,如果低于这个值,才需要考虑加大innodb buffer pool的大小 。
当然,还可以把这个命中率做到监控里,这样半夜sql变慢了,早上上班还能定位到原因,就很舒服 。
六、还有哪些骚操作?
前面提到的是在存储引擎层里加入了buffer pool用于缓存内存页,这样可以加速查询 。
那同样的道理,server层也可以加个缓存,直接将第一次查询的结果缓存下来,这样下次查询就能立刻返回,听着挺美的 。
按道理,如果命中缓存的话,确实是能为查询加速的 。但这个功能限制很大,其中最大的问题是只要数据库表被更新过,表里面的所有缓存都会失效,数据表频繁的更新,就会带来频繁的缓存失效 。所以这个功能只适合用于那些不怎么更新的数据表 。
另外,这个功能在8.0版本之后,就被干掉了 。所以这功能用来聊聊天可以,没必要真的在生产中使用啊 。

文章插图
查询缓存被删除
七、总结
- 数据查询过慢一般是索引问题,可能是因为选错索引,也可能是因为查询的行数太多 。
- 客户端和数据库连接数过小,会限制sql的查询并发数,增大连接数可以提升速度 。
- innodb里会有一层内存buffer pool用于提升查询速度,命中率一般>99%,如果低于这个值,可以考虑增大buffer pool的大小,这样也可以提升速度 。
- 查询缓存(query cache)确实能为查询提速,但一般不建议打开,因为限制比较大,并且8.0以后的Mysql里已经将这个功能干掉了 。
作者丨小白
来源丨公众号:小白debug(ID:xiaobaidebug)
dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn
推荐阅读
- mysql 慢查询
- 2021年3月份黄道吉日一览表-2021年3月吉日查询一览表
- 2020年12月结婚吉日老黄历-2020年12月结婚吉日查询
- 怎样查询2021高考录取情况?
- 2020年12月结婚黄道吉日查询-2020年12月结婚最好的日子
- 2020年12月结婚吉日-2020年12月结婚黄道吉日查询-2020年12月结婚最好的日子
- 什么时候可以查询高考录取结果?
- 男人约会的心理动机查询表 男人约你动机查询表
- 2020年阴历9月搬家黄道吉日查询-2020年阴历9月搬家哪个日子好
- linux系统安装mysql提示初始化失败怎么处理?
