Mysql慢查询
摘要:慢查询常见于页面加载慢或接口响应超1秒的情况,主要包括聚合查询、多表查询、大数据量查询和深度分页。解决方案:1)使用Arthas、Prometheus等工具调试;2)开启MySQL慢日志(测试阶段),配置slow_query_log=1和long_query_time=2秒。分析慢查询可使用EXPLAIN命令,关注key(命中索引)、type(连接类型,避免ALL全盘扫描)和Extra(优化
目录
如何定位慢查询?
慢查询可能出现的情况:
页面加载过慢、接口压测响应时间过长(超过1s)
1.聚合查询
2.多表查询
3.表数据量过大查询
4.深度分页查询
解决方案
方案1:使用开源工具
调试工具:Arthas
运维工具:Prometheus、Skywalking
方案2:Mysql自带的慢日志(测试阶段)
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有sql语句的日志
如果要开启慢查询日志,要在Mysql的配置文件(/etc/my.cnf)中配置如下信息:
#开启Mysql慢日志查询开关
slow_query_log=1
#设置慢日志的时间为2秒,SQL语句查询超过2秒,就会被视为慢查询,记录到慢查询日志当中
long_query_time=2
配置完成之后,重新启动Mysql服务器就行测试,查看慢日志文件当中记录的信息
如何定位慢查询?
慢查询可能出现的情况:
页面加载过慢、接口压测响应时间过长(超过1s)
1.聚合查询
2.多表查询
3.表数据量过大查询
4.深度分页查询
解决方案
方案1:使用开源工具
调试工具:Arthas
运维工具:Prometheus、Skywalking
方案2:Mysql自带的慢日志(测试阶段)
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有sql语句的日志
如果要开启慢查询日志,要在Mysql的配置文件(/etc/my.cnf)中配置如下信息:
#开启Mysql慢日志查询开关
slow_query_log=1
#设置慢日志的时间为2秒,SQL语句查询超过2秒,就会被视为慢查询,记录到慢查询日志当中
long_query_time=2
配置完成之后,重新启动Mysql服务器就行测试,查看慢日志文件当中记录的信息

慢日志功能在生产环境中不会开启,因为会损耗一些Mysql的性能。
回答
我们当时做测试的时候有的接口响应很慢,时间超过了两秒,因为是调试阶段,我们开启了Mysql的慢日志,当时在配置文件中配置的是SQL执行时间超过两秒就记录到慢日志文件当中,然后我们就可以在日志文件中找到执行比较慢的sql了
怎么分析慢查询?
可以采用EXPLAIN或者DESC命令获取Mysql如何执行SELECT语句的信息

几个关键的字段
possible_key:当前sql可能会使用到的索引
key:当前sql实际命中的索引
key_len:索引占用的大小
通过key和key_len来查看是否可能命中索引
Extra:额外的优化建议

type:这条sql连接的类型,性能由好到坏排列为:NULL、system、const、eq_ref、ref、range、index、all
NULL:查询未使用到表(开发中少见)
system:查询系统中的表
const:根据主键查询
eq_ref:主键索引查询或唯一索引查询
ref:索引查询
ranger:范围查询
index:索引树扫描
all:全盘扫描
在开发过程中,尽量不要有all或者index,如果有的话,这条sql就需要优化
回答
如果一条sql执行慢的话,我们通常可以使用mysql自带的执行计划explain来去查看这条sql的执行情况,比如在这里面可以通过key和len_key检查是否命中了索引,如果本身已经添加了索引,也可以判断索引是否有失效的情况,第二个,可以通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或者全盘扫描,第三给可以通过extra建议来判断,是否出现了回表的情况,如果出现了就可以尝试添加索引或者修改返回字段来修复。
更多推荐

所有评论(0)