MySQL-优化慢查询

307 阅读2分钟

一、定位慢查询

方案一:开源工具

  • 调试工具:Arthas
  • 运维工具:Prometheus、Skywalking

Skywalking是分布式系统的应用程序性能监视工具,专为微服务,云原生架构和基于容器(Docker,K8S,Mesos)架构而设计,它是一款优秀的APM(Application Performance Management)工具,包括了分布式追踪,性能指标分析和服务依赖分析等。支持Java、.Net、NodeJs等探针,数据存储支持Mysql、Elasticsearch等,跟Pinpoint一样采用字节码注入的方式实现代码的无侵入,探针采集数据粒度粗,但性能表现优秀,且对云原生支持。

xkZ1csWlPe.jpg

方案二: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,就需要做优化了。