
❓ 在mysql中,查询sql命中了索引且查询结果条数也不是很多,explain也分析过了,还是慢
对于一些有过开发经验的日常工作来说,sql优化基本上从索引层面已无法解决
除非你是初学者,不知道索引是什么、查询select *、limit 200W
这里从运维层面表达几个观点
🍑 InnoDB Buffer Pool
mysql的数据存储在磁盘上,查询数据时要先从缓冲池(内存)取,取不到再去磁盘取
如果都去磁盘取,那速度可不就慢下来了
但是总不能把所有数据都放到内存里,这里面有一个套自己的逻辑把一些关键的数据指标存入内存,而不是把整个搬内存里
有个指标命中率,理想值应大于 95%,过低说明需要参数调优了
🥝命中率指标查看
SHOW GLOBAL STATUS LIKE 'innodb_buffer_pool_read%';
命中率要自己算,计算公式为 命中率 = (1 - Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) * 100%
还有一种方法 SHOW ENGINE INNODB STATUS;
在输出的结果中,Status 字段搜索 pool hit rate,有显示 Buffer pool hit rate 1000 / 1000 就是100%命中,Buffer pool hit rate 987 / 1000 表示命中率为 98.7%
🍌调整参数
innodb_buffer_pool_size 这个参数决定了命中率,根据自己需求调整,自行斟酌
🍎连接数不合理
假设 Mysql 的连接数(这里是Mysql服务端)是10个,你有 11 个客户端进来,最后 1 个就会阻塞等待,阻塞等待的时间怕是比执行 Sql 的时间都难以接受
我可以接受数据量大 Sql 执行慢,但是不能容忍我的连接阻塞等待!!!
🍏查看 Mysql 服务端配置
Mysql服务端最大使用连接数,你可以理解为同时在线人数 show global status like 'Max_used_connections';
Mysql服务端最大容许连接数 show variables like 'max_connections%';
这两个值一除,就是使用率,很明显,使用率过高过低都不合理
参数如何设置,自行解决
🍐客户端
客户端通常自己也实现了一个连接池,避免网络连接断开的损耗,例如 Navicat工具和各大编程语言,以Go语言为例
GORM连接 Mysql时,设置了连接数为 20 个,Mysql服务端最大连接数设置了 100 个,这是一种非常的资源浪费
客户端连接池数要对标 Mysql 最大可连接数,榨干 CPU 资源,减少连接排队阻塞
🍓其它的
死锁、查询缓存(这个不提倡用了)、磁盘内存条寿命、查询量过大网络传输慢