看本篇文章之前建议先了解索引,索引分类,和回表查询的概念
导致慢查询的原因
-
聚合查询
-
多表查询
-
表数据量过大查询
-
深度分页查询
慢查询的现象就是页面加载过慢、接口压测响应时间过长,超过1s
如何定位慢查询
方案一
方案二
MySQL自带慢日志,这里主要讲这个,我的是8版本,你如果是5版本可能本篇文章帮助不大。
mysql中查询慢日志是否开启
show variables like 'slow_query_log';
mysql装在windows的话修改系统的my.ini配置文件,在这里能找到这个文件: C:\ProgramData\MySQL\MySQL Server 8.0,注意:ProgramData是隐藏起来的。
文件修改好是这样的。你只需要改第一行和第三行。第一行是慢日志开关,1为开,0为关。 第三行是慢日志记录时间(单位秒),sql执行超过这个时间就会被记录到慢日志文件
圈起来第二行是让你注意,慢查询日志不叫CCC-slow.log,千万注意,要想知道在哪,在mysql里面执行下面代码块语句。
show variables like '%slow_query_log%';
现在我执行一条语句,执行时间为15.21s,超过了2s
此时慢日志里面就会记录该条语句信息。
如何分析慢查询原因
导致慢的有下面四个原因,现在我们定位到了一条慢查询,如何分析导致慢的原因呢? 有一招叫做查看sql执行计划
这里来看个前置知识,慢查询聚合索引 的解决办法是建立临时表,多表查询 是优化sql,尽量别用多表查询,放业务里面查多次。表数据量过大用索引解决,深度分页查询后续再说。
把explain加在sql命令前面就可以查看该sql的执行计划,exlain是mysql自带的分析工具。 来看一个新sql的执行计划,这是个根据条件查询语句,可以根据索引去优化。
你需要关注字段如下
-
"possible_keys": 可能用到的索引。
-
"key": 实际用到的索引
-
"key_len": 索引占用的大小
-
"extra": 额外的优化建议,证明有优化空间,例如下图
- "type": 这条sql的连接的类型,性能由好到差为NULL、system、const、eq_ref、ref、range、index、all。 接下来我详细给你介绍一下这几个值的含义。
null: 是我们的sql没使用到表,这个很少见,无需关注。
system: 是指查询的是mysql系统中的表,开发也不常用。
const:(常用),根据主键查询。
eq_ref: 主键索引查询或唯一索引查询
ref: 根据索引查询,和eq_ref不一样,是其他索引,可以查出多条数据。例如select * from user where name = "张三";有可能多个人叫张三。
range: 范围查询。
index: 全索引查询,索引树扫描,效率不高,一般都是需要优化的。
all: 不走索引,效率最低,全盘扫描。需要优化。
慢查询分析总结