mysql定位慢查询以及分析原因

看本篇文章之前建议先了解索引,索引分类,和回表查询的概念

导致慢查询的原因

  1. 聚合查询

  2. 多表查询

  3. 表数据量过大查询

  4. 深度分页查询

慢查询的现象就是页面加载过慢、接口压测响应时间过长,超过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的执行计划,这是个根据条件查询语句,可以根据索引去优化。

你需要关注字段如下

  1. "possible_keys": 可能用到的索引。

  2. "key": 实际用到的索引

  3. "key_len": 索引占用的大小

  4. "extra": 额外的优化建议,证明有优化空间,例如下图

  1. "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: 不走索引,效率最低,全盘扫描。需要优化。

慢查询分析总结

相关推荐
小爬菜1 分钟前
Django学习笔记(项目默认文件)-02
前端·数据库·笔记·python·学习·django
Deutsch.20 分钟前
MySQL——主从同步
mysql·adb
猿小喵37 分钟前
MySQL四种隔离级别
数据库·mysql
Y编程小白43 分钟前
Redis可视化工具--RedisDesktopManager的安装
数据库·redis·缓存
洪小帅1 小时前
Django 的 `Meta` 类和外键的使用
数据库·python·django·sqlite
祁思妙想2 小时前
【LeetCode】--- MySQL刷题集合
数据库·mysql
V+zmm101342 小时前
教育培训微信小程序ssm+论文源码调试讲解
java·数据库·微信小程序·小程序·毕业设计
m0_748248022 小时前
【MySQL】C# 连接MySQL
数据库·mysql·c#
东软吴彦祖3 小时前
包安装利用 LNMP 实现 phpMyAdmin 的负载均衡并利用Redis实现会话保持nginx
linux·redis·mysql·nginx·缓存·负载均衡
慵懒的猫mi4 小时前
deepin分享-Linux & Windows 双系统时间不一致解决方案
linux·运维·windows·mysql·deepin