性能问题之慢查询
现象
查询接口,TPS比较低,响应时间比较长,此时数据库服务器的CPU占用率很高,应用服务器负载反而比较低。(如果数据库和应用程序安装在同一天机器上,数据库应用占用的CPU比较高,应用程序多占CPU较低)
案例
下面是某接口压测结果:
此时数据库服务器监控如下:
应用程序服务器监控如下:
从压测结果和监控来看,29并发时接口tps只有49,平均响应时间是406毫秒,接口性能比较差;应用服务器CPU使用率很低,数据库服务的CPU使用率很高,瓶颈应该是在数据库。
问题分析
1、开启慢SQL的配置:https://i.cnblogs.com/posts/edit-done;postId=15442700
2、慢查询开启与关闭
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
总结
联合索引:一个索引同时作用于多个字段 联合索引的最左前缀 联合索引检索数据时,会从最左边开始匹配(忽略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 否