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)顺序调用:一次性的顺序调用,而且调用之间没有结果上的依赖,可以使用多协程的方式

3)网络环境因素


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM