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 小时前
CockroachDB权威指南——CockroachDB SQL
数据库·分布式·架构
Eip不易也不e1 小时前
教程之同时安装两个版本的 mysql
mysql
数据智能老司机1 小时前
CockroachDB权威指南——开始使用
数据库·分布式·架构
松果猿2 小时前
空间数据库学习(二)—— PostgreSQL数据库的备份转储和导入恢复
数据库
Kagol2 小时前
macOS 和 Windows 操作系统下如何安装和启动 MySQL / Redis 数据库
redis·后端·mysql
无名之逆2 小时前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
s9123601012 小时前
rust 同时处理多个异步任务
java·数据库·rust
数据智能老司机2 小时前
CockroachDB权威指南——CockroachDB 架构
数据库·分布式·架构
hzulwy2 小时前
Redis常用的数据结构及其使用场景
数据库·redis
程序猿熊跃晖2 小时前
解决 MyBatis-Plus 中 `update.setProcInsId(null)` 不生效的问题
数据库·tomcat·mybatis