一、定位慢查询
方案一:开源工具
- 调试工具:Arthas
- 运维工具:Prometheus、Skywalking
Skywalking是分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计,它是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪,性能指标分析和服务依赖分析等。支持Java、.Net、NodeJs等探针,数据存储支持Mysql、Elasticsearch等,跟Pinpoint一样采用字节码注入的方式实现代码的无侵入,探针采集数据粒度粗,但性能表现优秀,且对云原生支持。
方案二:MySQL自带慢日志
慢查询日志记录了所有执行时间超过指定参数(long_query_time,单位:秒,默认10秒)的所有SQL语句的日志。如果要开启慢查询日志,需要在MySQL的配置文件(/etc/my.conf)中配置如下信息:
# 开启MySQL慢日志查询开关
slow_query_log=1
# 设置慢日志的时间为2s, SQL语句执行时间超过2s, 就会视为慢查询,记录慢查询日志
long_query_time=2
慢日志文件位置/var/lib/mysql/localhost-slow.log。
二、explain分析慢查询
找到慢查询sql以后,就需要分析sql问题并做优化了。可以采用explain或者desc命令获取MySQL如何执行select语句的信息。
下面分析explain执行计划的数据。
explain执行计划产生的列:
| 列 | 含义 |
|---|---|
| id | |
| select_type | |
| table | |
| partitions | |
| type | 这条SQL的连接类型。性能由好到差为NULL,system,const,eq_ref,ref,range,index,all |
| possible_keys | 当前SQL可能会用到的索引 |
| key | 当前SQL实际命中的索引 |
| key_len | 当前命中索引占用的大小 |
| ref | |
| rows | |
| filtered | |
| extra | 额外的优化建议。 |
通过key和key_len两个字段查看是否命中了索引。
| extra | 含义 |
|---|---|
| Using where;Using index | 查找使用了索引,需要的数据都在索引列中能找到,不需要回表查询数据。 |
| Using index condition | 查找使用了索引,但是需要回表查询数据 |
通过extra建议判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复。
| type | 含义 |
|---|---|
| NULL | 指在查询中没有使用到表。 |
| system | 查询的是MySQL内置的表。 |
| const | 根据主键查询。 |
| eq_ref | 根据主键或者唯一索引查询,只能查到一条数据。 |
| ref | 索引查询,可能会查到多条数据。 |
| range | 范围查询。 |
| index | 索引树扫描。 |
| all | 全表扫描。 |
如果一条SQL语句的执行计划中,type为index或者all,就需要做优化了。