当一个mysql的查询量很高时候,有很多种优化方案。
分库分表,主从分离等都是不错的选择。
主从分离情况下,我们怎么权衡一个DB够不够优秀呢?
通常我们会选择查询缓存命中率来作为读库的一个指标。
由于现在DB引擎都是Innodb居多。
所以下面都是以Innodb的角度来说。
MySql 缓存命中率是什么?
MySql查询读取磁盘的代价是很高的。
所以我们希望MySql尽可能的读取缓存。
缓存命中就是查询MySql的时候,直接从内存中得到结果返回。
计算公式 缓存命中率 = 读内存次数 / 查询总数。
一般来说。我们希望读库的缓存命中率达到 99.95% 以上。
MySql 缓存参数配置
查看当前缓存配置大小show variables like ‘innodb_buffer_pool_size’
1
2
3
4
5+-------------------------+------------+
| Variable_name | Value |
+-------------------------+------------+
| innodb_buffer_pool_size | 6442450944 |
+-------------------------+------------+
控制面板修改缓存大小SET GLOBAL innodb_buffer_pool_size=6442450944;
修改缓存大小方案修改mysql配置文档并重启mysql
在mysql控制面板修改配置,同时修改配置,不用重启
还有其他参数我们用不到
缓存命中率计算
根据公式 缓存命中率 = 读内存次数 / 查询总数 我们很容易算出命中率
读内存次数 = “Innodb_buffer_pool_reads”
查询总次数 = “Innodb_buffer_pool_read_requests”show status like ‘%pool_read%’
1
2
3
4
5
6+---------------------------------------+-------------+
| Variable_name | Value |
+---------------------------------------+-------------+
| Innodb_buffer_pool_read_requests | 42766114022 |
| Innodb_buffer_pool_reads | 566498466 |
+---------------------------------------+-------------+
但是这两个值是总的数量,并不是一段时间内的,参考价值不大,所以我们要取一段时间内的差值来算
命中率 = (第二次读内存次数 - 第一次读内存次数) / (第二次查询总数 - 第一次查询总数)
算了好多次,都是重复性的,有点繁琐,所以写了个脚本来算1
2
3
4
5
6
7
8
9
10
11MYSQL缓存命中查询脚本
请输入 mysql 用户/root xxx
请输入 mysql 密码/'' xxx
请输入 mysql 域名/localhost
请输入 mysql 端口/3306
请输入 间隔/60s 10
开始提取打点信息
第一次打点信息 请求数: 42766927561, 读磁盘数: 566510284
休眠10s
第二次打点信息 请求数: 42767040750, 读磁盘数: 566511295
命中率: 99.1068