Mysql - 查询很慢如何定位排查(接口访问耗时太长)
1)数据库本身
(1)查看数据库状态
(2)查找日志文件中是否有sql相关打印
(3)查看当前连接数
执行 show processlist 查看mysql正在运行的sql线程
(4)查看mysql慢查询日志(默认情况下,mysql不开启慢查询日志)
可通过命令:show variables like '%slow_query_log%';
查看mysql是否开启了慢查询,以及慢查询日志在哪?
ON表示已开启,时间阈值是10s。
(5) 通过解释函数explain分析sql语句 (可以检查是否匹配到索引)
explain select id from wow_movie_info
只需要注意一个最重要的type信息,很明显体现出是否用到索引,type结果值从好到坏依次是:
system > const > eq_ref > ref > range > index > ALL
一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。
(6) 优化 sql 逻辑或者尽量让 sql 走对的索引,例如:
1)、用in代替 or
2)、联合所用比单一索引更好,比如:时间一般为第一个参数,vgn_reported_data 联合索引(t,type,ch)
3)、myism引擎查询更快
(7)子查询过多,一般不建议使用子查询,可以把子查询改成join来优化
(8)深度分页问题
MySQL会把前120条数据都查出来,抛弃前100条,返回20条
select name,code from student limit 100,20
随着分页深度的增大,可能会变成 1000000,20。如此大的数据量,速度一定快不起来,最好的方式是增加一个条件:
select name,code from student where id > 1000000 limit 20
主键索引会直接链接到1000000处,然后查出20条,这个方式需要把上次查询出来的最大id以参数的方式传过来
(9)单纯的数据量过大,分表或分库+分表
2)业务逻辑层面(考虑是否需要开启协程)
1)循环调用:这种情况一般都循环调用同一段代码,每次循环的逻辑一致,前后不关联,可以使用多协程的方式
2)顺序调用:一次性的顺序调用,而且调用之间没有结果上的依赖,可以使用多协程的方式
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」