大家好,我是程序媛雪儿。
我觉得慢sql这个问题还是挺重要的,因为我目前了解到的后端服务器响应过慢,甚至是线程池爆满,内存溢出,很多时候究其根本原因,是因为有些慢sql没处理好,导致一个任务处理时间过长造成的,所以,咱们今天聊聊mysql慢查询。
如何定位慢查询呢?
方案一:开源工具
调试工具:Arthas
运维工具:Promethus、Skywalking
方案二:MySQL自带的慢日志
慢查询日志记录了所有执行时间超过指定参数的SQL语句。如果想要开启慢查询日志,需要在/etc/my.cnf中配置如下信息
# 开启慢查询开关 0 不开启(默认)1 开启
slow_query_log=1
# 设置sql语句执行超过2s,视为慢查询,记录到日志
long_query_time=2
慢查询日志记录位置:/var/lib/mysql/localhost-slow.log
如何分析慢查询SQL?
可以在sql语句前加上explain或者desc命令获取当前sql如何执行select语句的信息
字段解释:
-
possible_key 当前sql可能会使用到的索引
-
key 当前sql实际命中的索引
-
key_len 索引占用的大小(可以通过key和key_len查看是否可能会命中索引)
-
Extra额外优化建议
extra | 含义 |
Using where; Using Index | 直接使用了索引,需要的数据都在索引列中能找到,不需要回表查询数据 |
Using index condition | 直接使用了索引,但是需要回表查询数据 |
如果是Using index condition,sql建立的索引是需要优化的
-
type 指的是这条sql连接的类型,性能由好到差为NULL、system、const、eq_ref、ref、range、index、all
-
-
system:查询系统中的表
-
const:根据主键查询
-
eq_ref:主键索引查询或唯一索引查询(查询出来只有一条记录)
-
ref:索引查询(可能会有多条记录)
-
range:范围索引
-
index:索引树擦汗寻
-
all:全盘扫描
-
一般来说,type为index或者all,需要进行优化
我们找到慢sql后,下一步就是优化了,具体怎么优化呢,咱们留着以后聊。
欢迎大家关注我的微信公众号,程序媛雪儿,雪儿会定期在上面发布编程的知识碎片,也有雪儿博客地址,上面有详细系统的笔记,雪儿是全栈,但是公众号目前主要还是发后端的技术,以后可能也会涉及到一些前端的知识,我们下期见,拜拜~