Mysql Sql执行速度优化

kj2000.jpeg

❓ 在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 资源,减少连接排队阻塞

🍓其它的

死锁、查询缓存(这个不提倡用了)、磁盘内存条寿命、查询量过大网络传输慢

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容