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的哪些关键字?
在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# 字面量null对于引用类型变量✓和值类型变量×

编译器让相同的字符串字面量共享堆中的同一内存位置以节约内存。 在C#中,字面量(literal)是指直接表示固定值的符号,比如数字、字符串或者布尔值。而关键字(keyword)则是由编程语言定义的具有特殊含义的标…

羊大师解读,春季羊奶VS夏季羊奶

羊大师解读,春季羊奶VS夏季羊奶 夏季的羊奶和春季的羊奶在营养成分上并没有本质的区别,都含有丰富的蛋白质、矿物质和维生素等。然而,由于季节和气候的变化,人们饮用羊奶的需求和效果可能会有所不同。 在夏季,天气炎热…

C语言 | Leetcode C语言题解之第35题搜索插入位置

题目&#xff1a; 题解&#xff1a; int searchInsert(int* nums, int numsSize, int target) {int left 0, right numsSize - 1, ans numsSize;while (left < right) {int mid ((right - left) >> 1) left;if (target < nums[mid]) {ans mid;right mid - …

使用vue3+ts+vite从零开始搭建bolg(二)

二、全局变量 2.1element-ui集成 pnpm i element-plus pnpm i element-plus element-plus/icons-vue main.ts配置文件 import ElementPlus from element-plus import element-plus/dist/index.css //ts-ignore import zhCn from element-plus/dist/locale/zh-cn.mjsapp.use…

浅说深度优先搜索(中)——回溯

写在最前 相信在你们不懈的努力之下&#xff0c;基本的递归一定可以写出来了&#xff0c;那么我们现在就来看看递归的升级版——回溯怎么写吧&#xff01; 简说回溯 递归是一种特别重要的解题策略。大部分题目需要找到最优解&#xff0c;而这个求解过程可能存在一定的规律性…

UE5(基础动作)多人游戏制作蹲伏

1.创建输入操作&#xff0c;IA_Crouch 在输入映射中添加 IA_Crouch,在触发器中创建两个索引&#xff0c;已按下已松开来创建蹲伏输入。 蹲伏操作必须要勾选角色-角色移动-crouch勾选可蹲伏否则你的人物无法真正蹲下。 为蹲伏创建函数&#xff0c;创建布尔来判断是否蹲伏。 通过…

CodeGemma初探

什么是 CodeGemma CodeGemma是一系列强大而轻量级的模型的集合&#xff0c;可以执行各种编码任务&#xff0c;包括填充中间代码补全、代码生成、自然语言理解、数学推理和指令跟随。 版本&#xff1a; instruct&#xff1a;7B, 这个版本专门针对自然语言到代码聊天和指令跟随…

day83 AJAX

1什么是AJAX AJAX语法 AJAX Asynchronous JavaScript and XML 异步js和XML 实现页面某一部份更新&#xff0c;无需服务器转发或重定向 1 $.ajax() 语法: $.ajax( { "url" : "url&qu…

数据库主从复制

一、主从复制概述 1、介绍&#xff1a; 主从复制是指将主数据库的 DDL 和 DML 操作写入到二进制日志中&#xff0c;将二进制日志传送到从库服务器&#xff0c;然后在从库上对这些日志重新执行&#xff08;重做&#xff09;&#xff0c;从而使得从库和主库的数据保持同步。 M…

百面算法工程师 | 分类网络总结

欢迎大家订阅我的专栏一起学习共同进步&#xff0c;主要针对25届应届毕业生 祝大家早日拿到offer&#xff01; lets go http://t.csdnimg.cn/dfcH3 目录 4. 经典分类网络与发展 4.1 AlexNet 4.2 VGGNet 4.3 GoogLeNet Inception 4.4 ResNet 4.5 DenseNet 4.6 MobileN…

C#中的浅拷贝(Shallow Copy)和深拷贝(Deep Copy),深拷贝的集中实现方式,浅拷贝深拷贝的案例

C#中的浅拷贝&#xff08;Shallow Copy&#xff09;和深拷贝&#xff08;Deep Copy&#xff09; 拷贝就是创建一个对象&#xff0c;这个对象有着原始对象数据&#xff08;属性和字段&#xff09;的一份精确拷贝&#xff08;只针对Object和Array这样的引用数据类型&#xff09;…

截断堆积柱状图

本教程原文链接&#xff1a;截断堆积柱状图绘制教程 欢迎大家转载&#xff01;&#xff01;&#xff01;&#xff01; 本期教程 写在前面 堆积柱状图是柱状图的常见类型之一&#xff0c;也是平时使用概率较高的图形之一。我们前期发布了很多个柱状图的绘制教程&#xff0c;若你…

【工厂模式】简单工厂模式-简单例子

目录 一、简单介绍 二、未使用工厂模式之前 三、简单工厂模式 初始 优化 总结 一、简单介绍 工厂模式是一种软件设计模式&#xff0c;用于创建对象的方法。在工厂模式中&#xff0c;创建对象的逻辑被封装在一个单独的类中&#xff0c;该类负责根据特定条件或参数创建合适…

windows下使用命令uvicorn启动fastapi程序有乱码,方框形状奇怪字符

问题简述 执行命令uvicorn main:app --reload后出现的问题如图所示 这个问题非常容易解决&#xff01; 原因是windows控制台 默认未开启 ANSI颜色的支持 那么我们只需要开启就可以了 轻松解决 1 按下winR 打开运行 2 输入regedit 点击确定编辑注册表 3 新建值 值的名称为…

vue3组件封装系列-表单请求

我们在开发一些后台管理系统时&#xff0c;总是会写很多的列表查询页面&#xff0c;如果不封装组件&#xff0c;就会无限的复制粘贴&#xff0c;而且页面很冗余&#xff0c;正常情况下&#xff0c;我们都是要把组件进行二次封装&#xff0c;来达到我们想要效果。这里我分享一下…

《中学科技》是什么级别的刊物?如何投稿?

《中学科技》是什么级别的刊物&#xff1f;如何投稿&#xff1f; 《中学科技》创刊于1976年&#xff0c;由上海世纪出版&#xff08;集团&#xff09;有限公司主管&#xff0c;上海科技教育出版社有限公司主办的省级学术期刊&#xff0c;《中学科技》以传播科技知识、启迪智慧…

Centos安装软件失败There are no enabled repos.

这个错出现的原因可能是&#xff1a;没有先安装wget源&#xff0c;就把源给备份了 解决方案&#xff1a; 下载对应版本repo文件, 放入/etc/yum.repos.d/里&#xff0c;下载地址&#xff1a;CentOS镜像使用帮助 查看自己CentOS的版本&#xff0c;下载对应的repo文件&#xff…

spring boot中的标注@Component、@Service等

让我告诉你什么叫水货。 一、水货横行 一直以来&#xff0c;我对Spring Boot项目中的标注&#xff0c;像Component啦、Service啦、Configuration啦&#xff0c;甚至Autowired啦&#xff0c;等等&#xff0c;都似懂非懂。Autowired与Resource有什么区别也不清楚。 个中原因&a…

LearnOpenGL(三)之GLSL

一、GLSL 着色器是使用一种叫GLSL的类C语言写成的。 着色器的开头总是要声明版本&#xff0c;接着是输入和输出变量、uniform 和main函数。每个着色器的入口点都是main函数&#xff0c;在这个函数中 我们处理所有的输入变量&#xff0c;并将结果输出到输出变量中。 二、数据…

2-Embedding例子:简单NN网络、迁移学习例子(glove语料预训练)

一、简单例子&#xff1a;构造简单NN网络生成Embedding 1、pytorch例子 2、tensorflow例子 # 1导入模块 import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Embedding import numpy as np# 2构建语料库 corpus[[…