性能问题之慢查询

现象

查询接口,TPS比较低,响应时间比较长,此时数据库服务器的CPU占用率很高,应用服务器负载反而比较低。(如果数据库和应用程序安装在同一天机器上,数据库应用占用的CPU比较高,应用程序多占CPU较低)

 

案例

下面是某接口压测结果:

此时数据库服务器监控如下:

应用程序服务器监控如下:

从压测结果和监控来看,29并发时接口tps只有49,平均响应时间是406毫秒,接口性能比较差;应用服务器CPU使用率很低,数据库服务的CPU使用率很高,瓶颈应该是在数据库。

 

问题分析

1、开启慢SQL的配置:https://i.cnblogs.com/posts/edit-done;postId=15442700

 

2、慢查询开启与关闭

mysql> show variables like '%slow_query_log%';

 

3、慢查询日志分析

(1)使用mysqldumpslow

  1> 先安装 perl:yum install -y perl 

  2> 在/usr/bin 目录下,使用 mysql 自带命令 mysqldumpslow:

    -s,是 order 的排序,主要有 c,t,l,r 和 ac,at,al,ar,分别是按照 query 次数,时 间,lock 的时间和返回的记录数来排序

    -a,倒序排列 

    -t,是 top n 的意思,即为返回前面多少条的数据 

    -g,后边可以写一个正则匹配模式,大小写不敏感的

  例如:

    mysqldumpslow -s c -t 20 host-slow.log   查看访问次数最多的 20 个 sql 语句

    mysqldumpslow -s r -t 20 host-slow.log    查看返回记录集最多的 20 个 sql语句

    mysqldumpslow -t 10 -s t -g “left join” host-slow.log   按照时间返回前 10 条里面含有左连接的 sql 语句

    mysqldumpslow –s at -t 50 host-slow.log   显示出耗时最长的 50 个 SQL 语句的执行信息

(2)可以直接将整个慢查询日志下载查看分析

(3)使用explain来了解SQL执行的状态:https://www.cnblogs.com/daydayup-lin/p/15442700.html

 

总结

数据库服务器CPU高,一般都是因为SQL执行效率低导致的,可能有三方面的原因:
(1)数据库表缺少必要的索引
(2)索引不生效
(3)SQL不够优化
 
索引
索引:对数据库表中一列或者多列的值进行排序的一种结构,存储了表中的关键字段,使用索引可快速访问数据库表中的特定信息。类似于书籍中的目录。

联合索引:一个索引同时作用于多个字段 联合索引的最左前缀 联合索引检索数据时,会从最左边开始匹配(忽略sql字段顺序),如果匹配不到,就不使用索引、

如:User表有联合索引 my_index(A字段,B字段,C字段)

SQL 是否使用索引:

select * from User where A = 1 是

select * from User where B = 2 否

select * from User where C = 3 否

select * from User where A= 1 and B = 2 是

select * from User where A= 1 and C = 3 是

select * from User where B= 2 and C = 3 否

 

 

posted @ 2022-04-17 12:37  阳光倾林  阅读(185)  评论(0编辑  收藏  举报