MySQL慢查询怎么办?需要关注Explain的哪些关键字?

目录

  • 1-引言:什么是慢查询
    • 1-1 慢查询定义
    • 1-2 为什么排查慢查询
  • 2-核心:慢查询排查
    • 2-1 慢查询定位
    • 2-2 慢查询解决
      • 2-2-1 Explain 排查慢查询
      • 2-2-2 Explain 重点关键字
  • 3-总结:慢查询知识点小结


image.png


1-引言:什么是慢查询

1-1 慢查询定义

  • 定义:在MySQL中,慢查询是指执行时间超过预设阈值的SQL语句。这种查询的执行时间长,效率低下,通常需要优化。
  • 阈值:慢查询日志通过 long_query_time 变量定义超时时间。任何查询执行时间超过这个值的,都会被记录到慢查询日志中。
  • 根据业务场景的不同,这个阈值的设定是不一样的,如果业务内部设置慢查询的阈值为 1s,则一条 SQL 语句在执行的过程中超过了 1 秒,则会被记录为慢查询。

1-2 为什么排查慢查询

提升应用性能

  • 慢查询是影响应用程序性能的主要瓶颈之一。查询执行时间长会直接导致用户体验差,特别是在数据驱动的应用中,响应时间是用户满意度的关键因素。通过优化慢查询,可以显著减少请求的响应时间,提高整体应用性能。

避免潜在的锁竞争和死锁

  • 慢查询可能会持有长时间的锁,增加死锁的风险,尤其是在涉及多个表或多行的复杂查询中。这种锁竞争会影响数据库的并发处理能力,造成更多的性能问题。优化慢查询有助于减少锁的持有时间,提高并发性能。

2-核心:慢查询排查

2-1 慢查询定位

慢查询定位方式可以通过 配置MySQL自带的慢查询日志、

  1. 根据 位于 MySQL 安装目录下 etc 或 conf 中的 MySQL 的配置文件 my.ini (或 my.cnf)
  2. 在配置文件中启用慢查询日志:找到或添加配置项,并取消注释
# 启用慢查询日志,记录执行时间超过长查询时间的查询。
slow_query_log = 1

# 指定存储慢查询日志的文件路径。
slow_query_log_file = /path/to/slow-query.log

# 设置被认为是慢查询的阈值(单位:秒)。
long_query_time = 1
  1. 重启MySQL服务:保存配置文件并重启MySQL服务,以使得配置文件生效
sudo systemctl restart mysql
  1. 查看慢查询日志内容:根据上述配置文件的路径,查看慢查询日志(Linux)
vim /path/to/slow-query.log

慢查询日志示例:

# Time: 2024-04-18T08:22:34.983941Z
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 11.293402  Lock_time: 0.000137 Rows_sent: 45  Rows_examined: 89723
SET timestamp=1650277354;
SELECT * FROM orders WHERE date BETWEEN '2024-04-01' AND '2024-04-18';
  • Time:
    • 日志记录的时间戳,指示查询执行的具体时间。
  • User@Host:
    • 执行查询的数据库用户及其来源主机。
  • Query_time: 查询执行的总时间,单位是秒;
  • Lock_time:查询在等待锁的时间,单位是秒;
  • **Rows_sent:**查询结果发送给客户端的行数。;
  • Rows_examined:查询过程中检查的行数,反映了查询的负载。
  • SET timestamp:设置查询发生时间的时间戳,有助于复现查询环境。
  • SQL Query:
    • 实际执行的SQL查询语句。

2-2 慢查询解决

慢查询的常见原因:

  • 索引缺失或不适当:如果查询中涉及的表缺少适当的索引,数据库需要进行全表扫描来查找数据,这通常是导致查询变慢的主要原因之一。
  • SQL语句问题:复杂的查询、过度使用子查询、错误的连接(例如笛卡尔连接)或未能有效使用MySQL的优化器都可能导致性能问题。

2-2-1 Explain 排查慢查询

Explain 语句的作用

在MySQL中,EXPLAIN语句是一种非常有用的工具,用于帮助开发者和数据库管理员理解MySQL是如何执行一个特定的查询语句的。通过使用EXPLAIN,你可以获得关于SQL执行计划的详细信息,这包括查询如何使用索引,以及在查询过程中涉及哪些表和操作。这些信息对于优化查询性能至关重要。

  • 通过explain关键字可以查看sql语句的执行计划来评估sql语句的性能!

2-2-2 Explain 重点关键字

主要关注** type、key、rows、Extra **这四个字段
**① type关键字 **表示访问方法,性能由好到差:NULLsystemconsteq_refrefrangeindexall

  • 越往前越好,一般业务中不会出现优化到NULL的情况
  • 根据主键/唯一索引进行访问,一般会出现const
  • 根据非唯一性的索引进行访问时,一般会出现ref
  • index:表示使用了索引,但是要对整个索引树进行扫描…虽然比 all 好一点,但性能也不是特别好!
  • all:全表扫描…

Key关键字:实际用到的索引,如果为 NULL 则表示没有使用索引
rows 关键字:MySQL认为必须要执行查询的行数,在 InnoDB引擎的表中,是一个估计值,可能并不总是准确的。
Extra 关键字:Extra列提供了关于MySQL如何执行查询的额外信息。这些信息对于理解查询执行的具体细节以及优化查询性能非常有用。Extra列中的信息可以帮助你识别查询中的潜在性能问题,例如是否进行了文件排序、是否使用了临时表、是否利用了索引等。

  • Extra 关键字中各个结果含义
  • 1、using index:满足了覆盖索引,不需要回表.直接返回给server层
  • 2、using index condition
    • 使用了索引下推…搜索的列存在于索引列,但是无法为其生产扫描区间…
    • 有些搜索条件虽然包含了索引列,但是无法为其生成扫描区间.(索引下推优化…也会有回表,只是减少回表次数…)
  • 3、using where
    • 有搜索条件必须要在server进行判断(过滤),而不能直接在存储引擎层基于索引就完成所有判断.
    • 在server还要完成对别的条件的过滤!
  • 4、using filesort
    • 无法在索引下直接完成排序,而是需要开辟新的内存空间来进行排序!
  • 5、using join buffer
    • 联表查询时,采用了基于块的循环嵌套连接算法来优化.开辟一个join buffer来存放驱动表中查询出来
    • 符合条件的记录,减少对被驱动表的访问次数.没有加索引…
  • 6、using temporary
    • 使用了临时表,性能并不好!

3-总结:慢查询知识点小结

MySQL慢查询怎么办?需要关注Explain的哪些关键字?
在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/562423.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

配置静态路由实现全网互通

1、实验环境 如图下所示,三台路由器R1.R2,R3两两互连,每台路由器上都配置了Loopback地址模拟网络环境。 2、需求描述 需要在三台路由器上配置静态路由,以实现各网段之间的互通。 若要实现全网互通,必须明确如下两个问…

kaggle 泰坦尼克使用xgboost 得分0.73684

流程 导入所要使用的包引入kaggle的数据集csv文件查看数据集有无空值填充这些空值提取特征分离训练集和测试集调用模型 导入需要的包 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarni…

Hive基础5

一、窗口函数 聚合,取值函数 排序函数 over(partition by 分组字段 order by 字段 row between 起始行 and 结束行) /*创建部门表*/ CREATE TABLE dept (deptno INT PRIMARY KEY,dname VARCHAR(50) comment 部门名称,loc VARCHAR(50) comment 工作地点 ); ​ /*…

2024团体程序设计天梯赛L1-101 别再来这么多猫娘了!

题目链接L1-101 别再来这么多猫娘了&#xff01; #include<iostream> #include<stdio.h> #include<string.h> #include<string> #include<algorithm> using namespace std; string s[105], text; int n, k, ans, a[5005];int main() { // ios::s…

【项目】基于JDBC+MySQL的Java教务管理系统(附源码+论文说明)

摘要 随着信息技术的不断发展&#xff0c;教育管理也在向数字化、智能化方向迈进。Java作为一种广泛应用于企业级应用开发的编程语言&#xff0c;与数据库技术的结合更是为教务管理系统的开发提供了强大的支持。 本文将介绍基于JDBC&#xff08;Java Database Connectivity&a…

短视频不够500有效粉丝怎么涨?如何涨有效粉丝?巨量千川投流怎么涨粉的?

近期&#xff0c;一些使用抖音橱窗功能的用户遇到了一个问题&#xff0c;他们在挂橱窗时会出现“有效粉丝不足500”无法正常挂橱窗的提示。这个问题是由于抖音平台改变了规则所致。现在&#xff0c;只有通过观看视频而非刷关注的粉丝才被算作有效粉丝&#xff0c;其他的粉丝都将…

39. UE5 RPG角色释放技能时转向目标方向

在上一篇&#xff0c;我们实现了火球术可以向目标方向发射&#xff0c;并且还可以按住Shift选择方向进行攻击。技能的问题解决&#xff0c;现在人物释放技能时&#xff0c;无法朝向目标方向&#xff0c;接下来我们解决人物的问题。 实现思路&#xff1a; 我们将使用一个官方的…

(CVPR,2023)SAN:用于开放词汇语义分割的边缘适配网络

文章目录 相关论文相关资料摘要引言方法对视觉 token 的特征融合使用注意力偏差进行掩码识别分割图像生成 实验 相关论文 &#xff08;CVPR&#xff0c;2024&#xff09;SED&#xff1a;一个用于开放词汇语义分割的简单编解码器 &#xff08;CVPR&#xff0c;2024&#xff09;…

python int占几个字节

《深入理解计算机系统》这本书上面提到了在32位机器和64机器中int类型都占用4个字节。《The C Programming language》这本书&#xff0c;里面有一句话是这样的&#xff1a;Each compiler is free to choose appropriate sizes for its own hardware, subject only to the rest…

https协议的加密方式详解

各位大佬能多多点赞关注评论收藏&#xff0c;球球各位大佬们了&#xff01;&#xff01; &#xff01; 目录 1.为什么要加密&#xff1f; 2.如何加密 1.密钥&#xff08;yue,第四声&#xff09; 2.对称加密 3.非对称加密 4.公证机构 3.总结 1.为什么要加密&#xff1f;…

systemverilog中位的选择

常用的变量类型就是 reg 和 wire &#xff0c;这两种类型可以定义 一位的变量&#xff0c;也可以定义多位&#xff0c;其中 1 bit 的变量称为 标量(scalar)&#xff0c;多 bit 的变量称为 向量(vector)&#xff0c;如下所示&#xff1a; wire o_nor; // singl…

【树莓派】如何刷个系统给树莓派4B,如何ssh登陆到树莓派

文章目录 下载树莓派镜像下载烧写软件烧写编辑设置连接树莓派4B重启ssh查看树莓派IPssh远程连接问询、帮助 下载树莓派镜像 https://www.raspberrypi.com/software/operating-systems/#raspberry-pi-os-64-bit 下载烧写软件 https://www.raspberrypi.com/software/ 烧写 编辑…

7. Spring Boot 创建与使用

经过前面的六篇文章&#xff0c;Spring Framework的知识终于大致讲完了&#xff0c;但是Spring AOP还没提到&#xff0c;个人认为Spring AOP更适合放在Spring MVC之后再讲解&#xff0c;而讲解Spring MVC前先学习Spring Boot的目的也是为了在学习Spring MVC的时候直接使用Sprin…

EelasticSearch使用

1. Easy-ES介绍 Easy-Es 2. 导入依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions>//排除框架中原有的依赖包<exclusion><groupId>org.elast…

Vue3 + Js + Element-Plus + VueX后台管理系统通用解决方案

前言 本文是作为学习总结而写的一篇文章&#xff0c;也是方便以后有相关需求&#xff0c;可以直接拿来用&#xff0c;也算是记录吧&#xff0c;文中有一些文件的引入&#xff0c;没给出来&#xff0c;完整项目地址&#xff08;后续代码仓库放这里&#xff09; 1、layout解决方…

kaggle 纽约预测出租车价格 得分 5.34072

流程 导入所要使用的包引入kaggle的数据集csv文件查看数据集有无空值填充这些空值提取特征分离训练集和测试集调用模型 数据资源获取 数据资源获取 导入需要的包 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns引入kaggl…

基于CH32V103的多功能推杆设计

一、项目简介 “创意源于生活&#xff0c;工具始于懒惰。” 整体造型外观参考了最近比较火的夫妻游戏《双人成行》第一关里面那个吸尘器的推杆开关&#xff0c;结构中采用阻尼器/滚珠轴承等器件&#xff0c;使其非常具有质感和手感。功能上我构思不能只有电脑开关这么简单地一…

高架学习笔记之软件架构风格

目录 零、什么是软件架构风格 一、常见的软件架构风格 二、数据流风格 2.1. 批处理风格 2.2. 管道-过滤器风格 三、调用/返回风格 3.1. 主/子程序风格 3.2. 面向对象风格 3.3. 层次型风格 3.4. 客户端/服务器风格 3.4.1. 两层C/S体系结构 3.4.2. 三层C/S体系结构 …

Redis报错:CROSSSLOT Keys in request don‘t hash to the same slot的解决方案

最近&#xff0c;项目上线的时候&#xff0c;出现了一个Redis的报错&#xff1a;CROSSSLOT Keys in request dont hash to the same slot&#xff0c;这个在内网环境下无法复现&#xff0c;因为正式环境的Redis是cluster集群模式&#xff0c;而我们内网环境是单机模式。(后面我…

k8s安装,linux-ubuntu上面kubernetes详细安装过程

官方文档&#xff1a;https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/ 环境配置 该部分每个主机都要执行 如果你确定不需要某个特定设置&#xff0c;则可以跳过它。 设置root登录 sudo passwd root sudo vim /etc/ssh/sshd_config Perm…