详解MySQL慢SQL定位、分析

news2024/11/17 21:44:04

目录

1.概述

2.慢SQL定位

3.SQL性能分析

3.1.例子

3.2.SQL性能分析

3.3.参数说明

3.3.1.id

3.3.2.select_type

3.3.3.key_len

3.3.4.rows

3.3.5.type

3.3.6.extra


1.概述

解决慢SQL的问题无非散步,定位慢SQL、分析慢SQL、优化慢SQL,本文将按顺序介绍前两步该怎么做,第三步将会在后续的文章中

2.慢SQL定位

mysql自带了慢sql日志这个功能,以下是使用方法。

开启慢sql统计:

SET GLOBAL slow_query_log = on;   //开启慢sql统计开关

设置判断为慢sql的阈值(单位秒):

SET GLOBAL long_query_time = 1;

设置日志位置:

set global slow_query_log_file="D:\\slow.log";

我在sys_user这个自己建的表里插入了一百万条数据,简单执行一个数量统计的SQL就会触发慢sql的阈值被记录下来:

3.SQL性能分析

3.1.例子

create table course_info
(
    cid   bigint primary key,
    name varchar(255),
    _desc varchar(255)
) engine = innodb
  default charset = utf8;

create table teacher_info
(
    tid   bigint primary key,
    name varchar(255),
    _desc varchar(255)
) engine = innodb
  default charset = utf8;

create table school_timetable
(
    id   bigint primary key,
    tid bigint,
    cid bigint
)engine = innodb
 default charset = utf8;

三张表,course(课程表)、teacher(教师表)、teacherCard(教师信息表),具体数据和表关系如下:

表数据:

insert into course_info value(1,'计算机组成原理','介绍计算机的体系结构');
insert into course_info value(2,'数据结构','介绍如何高效的组织数据');
insert into course_info value(3,'操作系统','介绍如何管理调度计算机的资源');
insert into course_info value(4,'JAVA','天下第一的编程语言');

insert into teacher_info value(1,'冯诺依曼','现代计算机之父');
insert into teacher_info value(2,'图灵','计算机科学之父');
insert into teacher_info value(3,'林纳斯托瓦兹','Linux之父');
insert into teacher_info value(4,'詹姆斯高斯林','java之父');

insert into school_timetable value(1,1,1);
insert into school_timetable value(2,2,2);
insert into school_timetable value(3,3,3);
insert into school_timetable value(4,4,4);

3.2.SQL性能分析

可以通过explain关键字来对SQL进行性能分析,MySQL的EXPLAIN是一个查询优化工具,用于分析查询语句的执行计划,它会清晰的展示MySQL将会如何执行某个查询语句,包括执行的步骤、执行顺序、使用的索引、访问表的方式、以及如何连接表等。

以这条SQL为例:

explain select * from teacher_info;

我们能得到以下结果集:

结果集包含以下参数:

参数作用
id编号
select_type查询类型
table
type连接类型
possible_keys预测用到的索引
key实际用到的索引
key_len实际用到的索引长度
ref本次查询引用了哪些字段,哪些数据进行查找
rows完成当前查询,预计所要读取的行数
Extra额外的信息

下面对一些核心参数进行一下详细介绍。

3.3.参数说明

3.3.1.id

每条SQL都会有个id用来决定执行顺序,

id值同则由大向小降序执行。

explain
select * from teacher_info
UNION
SELECT * FROM school_timetable

 

 id值相同则由上往下顺序执行。

explain
select * from teacher_info
left join school_timetable on teacher_info.tid=school_timetable.tid
left join course_info on course_info.cid=school_timetable.cid;

3.3.2.select_type

select_type,查询类型,这个参数会有点绕,但是其实理解即可,它在调优里用处并不大。  

3.3.3.key_len

key_len,实际用到的索引长度,可以用来辅助判断复合索引内生效的部分。

假设我建立了一个复合索引:

CREATE INDEX cid_tid ON school_timetable (cid, tid)

索引全部生效:

explain select * from school_timetable where cid=4 and tid=4

 部分索引生效:

explain select * from school_timetable where cid=4

3.3.4.rows

完成当前查询,预计所要读取的行数,是个估计值,不准确。

explain select * from school_timetable where cid<4

3.3.5.type

type,查找方式,查询操作的访问类型,它描述了 MySQL 在执行查询时使用的访问方法。

整个执行计划中重中之重的一个参数,整个SQL优化就是围绕此参数进行优化。

常用的访问方法按速度排:

  • system:系统表的查询,仅返回一行结果,速度最快。

  • const:常量查询,这种类型的查询是基于常量条件进行的,例如主键或唯一索引的查询,MySQL 在查询过程中已经确定只有一条匹配的结果。

  • eq_ref:唯一索引访问,通过唯一索引查找。这种类型的查询通常用于使用主键或唯一索引进行关联查询,每个索引值只有一条匹配的结果。

  • ref:非唯一索引访问,通过非唯一索引查找。这种类型的查询通常用于使用非唯一索引进行查询,每个索引值可能有多条匹配的结果。

  • range:范围扫描,对索引使用了范围查找,例如使用 BETWEEN<> 等操作符进行的查询。

  • index:索引扫描,MySQL 使用非唯一索引进行扫描,表示在索引列上进行了查找。

  • ALL:全表扫描,MySQL 将对表中的每一行进行遍历。这种类型的查询通常发生在没有使用索引或无法使用索引的情况下,性能较差。

在实际工程中,前三种情况是很难达到的,基本没有什么适用场景,所以我们需要尽力保障能达到ref、range或者index,也就是至少要保证索引是有效的。

以下是前文表中出现以上情况的示例,由于system和eq_ref比较难造,暂时不包括:

const:

ref:

index:

range:

3.3.6.extra

这个字段表示查询后是否还要进行额外的操作再生成结果集。常见的值如下:

  1. Using index: 表示查询使用了覆盖索引,即查询的数据可以直接从索引中获取,而无需进一步访问表数据。

  2. Using where: 表示查询使用了 WHERE 条件进行过滤。

  3. Using temporary: 表示查询需要创建临时表来处理结果集,通常发生在需要进行排序、分组或多表连接的情况下。

  4. Using filesort: 表示查询需要进行排序操作,MySQL 无法使用索引进行排序,因此需要额外的文件排序操作。

  5. Using index condition: 表示查询使用了索引条件进行过滤。

  6. Using join buffer: 表示查询使用了连接缓冲区。

  7. Distinct: 表示查询使用了 DISTINCT 关键字进行去重。

  8. Full scan on NULL key: 表示在索引上执行全表扫描,但索引键值为空。

  9. Range checked for each record: 表示对每条记录都进行了范围检查。

  10. Using index for group-by: 表示查询使用了索引来进行分组操作。

  11. Using index for order by: 表示查询使用了索引来进行排序操作。

  12. Using index condition; Using where: 表示查询同时使用了索引条件和 WHERE 条件。

对于 SQL 调优来说,extra 字段是非常重要的。它提供了关于查询执行计划中的额外信息,可以帮助我们识别查询的性能瓶颈和优化的方向。

通过分析 extra 字段,我们可以判断以下情况:

  1. 是否使用了索引:Using index 表示查询使用了覆盖索引,可以避免访问表数据,提高查询性能。如果没有使用索引,可能需要考虑添加适当的索引来优化查询。

  2. 是否进行了排序:Using filesort 表示需要额外的文件排序操作,这可能导致性能下降。如果频繁出现文件排序,可能需要考虑优化查询或调整索引。

  3. 是否创建了临时表:Using temporary 表示需要创建临时表来处理结果集,可能会影响性能。需要审查查询语句并考虑是否可以避免使用临时表。

  4. 是否进行了全表扫描:Using index 表示使用了索引,而 Using index; Using where 表示同时使用了索引和 WHERE 条件进行过滤。如果出现 Using index 之外的情况,可能需要优化查询或调整索引以避免全表扫描。

  5. 是否使用了连接缓冲区:Using join buffer 表示使用了连接缓冲区,可能会影响查询性能。需要审查查询语句并考虑是否可以优化连接操作。

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

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

相关文章

高效提升计算质量!瑞典量子计算机首次应用于化学

​ &#xff08;图片来源&#xff1a;网络&#xff09; 量子计算机可以模拟化学过程&#xff0c;从新药开发到新材料的方方面面&#xff0c;它都能带来重大影响&#xff0c;人们对此寄予厚望。在瑞典&#xff0c;查尔姆斯理工大学的研究人员首次使用量子计算机在实际化学中进行…

PyQt5桌面应用开发(9):经典布局QMainWindow

本文目录 PyQt5桌面应用系列桌面程序基本布局QMainWindow概况与使用主窗体菜单栏工具栏停靠窗状态栏 代码编辑器的例子总结 PyQt5桌面应用系列 PyQt5桌面应用开发&#xff08;1&#xff09;&#xff1a;需求分析 PyQt5桌面应用开发&#xff08;2&#xff09;&#xff1a;事件循…

113-Linux_安装c/c++开发库及连接mysql数据库

文章目录 一.安装c/c开发库二.连接mysql数据库三.用户的管理与授权 mysql数据库的安装 一.安装c/c开发库 安装开发c/c的库&#xff0c;命令&#xff1a;apt install libmysqlclient-dev 二.连接mysql数据库 #include<stdio.h> #include<mysql/mysql.h>void fun…

JAVA13新特性

JAVA13新特性 概述 2019年9月17日&#xff0c;国际知名的OpenJDK开源社区发布了Java编程语言环境的最新版本OpenJDK13。 Features&#xff1a;总共有5个新的JEP(JDK Enhancement Proposals): http://openjdk.java.net/projects/jdk/13/Features 350:Dynamic CDS Archives 动…

C++ STL之vector基础

文章目录 前言STL之vector基础1. What&#xff1a;什么是 vector&#xff1f;2. Why&#xff1a;为什么使用 vector&#xff1f;3. How&#xff1a;怎么使用vector?3.1 vector的定义演示&#xff1a;输出&#xff1a; 3.2 vector iterator 的使用演示&#xff1a;输出&#xf…

网络基础学习:什么是tcp/ip协议

什么是tcp/ip协议 TCP/ip协议是什么东西&#xff1f;tcp/ip四层模型一、应用层二、传输层三、网络层四、网络接口层 TCP/ip协议是什么东西&#xff1f; TCP/IP是一种网络协议套件&#xff0c;它由传输控制协议&#xff08;TCP&#xff09;和互联网协议&#xff08;IP&#xff…

最大网络流算法之dinic算法详解

1、题目描述 On the Internet, machines (nodes) are richly interconnected, and many paths may exist between a given pair of nodes. The total message-carrying capacity (bandwidth) between two given nodes is the maximal amount of data per unit time that can b…

2016年上半年软件设计师下午试题

试题四 【说明】 模式匹配是指给定主串t和子串s&#xff0c;在主串 t 中寻找子串s的过程&#xff0c;其中s称为模式。如果匹配成功&#xff0c;返回s在t中的位置&#xff0c;否则返回-1 。 KMP算法用next数组对匹配过程进行了优化。KMP算法的伪代码描述如下&#xff1a; 在串…

【Python入门】Python的判断语句(if语句的基本格式)

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于Python零基础入门系列&#xff0c;本专栏主要内容为Python基础语法、判断、循环语句、函…

如何使用SpringMVC之常用注解

❣️关注专栏&#xff1a;JavaEE Spring MVC ⌛️ 1. Spring MVC 创建和连接⌛️ 1.1 RequestMapping⌛️ 1.2 GetMapping⌛️ 1.3 PostMapping ⌛️ 2. 获取参数⌛️ 2.1 传递/获取单个参数⌛️ 2.2 传递/获取多个参数⌛️ 2.3 传递/获取对象⌛️ 2.4 参数重命名⌛️ 2.4.1 …

【链表OJ题 5】牛客 CM11 链表分割

目录 题目来源&#xff1a; 代码实现&#xff1a; 1.带哨兵位的头结点 2.不带哨兵位的头结点 思路分析&#xff1a; 1.带哨兵位的头结点 实现过程&#xff1a; 易错点&#xff1a; 2.不带哨兵位的头结点 实现过程&#xff1a; 易错点&#xff1a; 题目来源&#xff…

【图神经网络】GNNExplainer代码解读及其PyG实现

GNNExplainer代码解读及其PyG实现 使用GNNExplainerGNNExplainer源码速读前向传播损失函数 基于GNNExplainer图分类解释的PyG代码示例参考资料 接上一篇博客图神经网络的可解释性方法及GNNexplainer代码示例&#xff0c;我们这里简单分析GNNExplainer源码&#xff0c;并用PyTor…

2023年中职组“网络空间安全”赛项XX市竞赛任务书

2023年中职组“网络空间安全”赛项 XX市竞赛任务书 一、竞赛时间 共计&#xff1a;180分钟 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段单兵模式系统渗透测试 任务一 SSH弱口令渗透测试 100分钟 100 任务二 Linux操作系统渗透测试 100 任…

deep learning system 笔记 自动微分 reverse mode AD

计算图 Computational Graph 图上的每个节点代表一个中间值边事输入输出的关系 forward 求导 forward mode AD 上图中从前向后&#xff0c;一步一步计算每个中间值对 x1的偏导&#xff0c;那么计算到 v7&#xff0c;就得到了整个函数对于 x1的偏导。 有limitation 对一个参数…

单机版部署Redis详细教程

概述 大多数企业都是基于Linux服务器来部署项目&#xff0c;而且Redis官方也没有提供Windows版本的安装包。因此课程中我们会基于Linux系统来安装Redis. 此处选择的Linux版本为CentOS 7. Redis的官方网站地址&#xff1a;https://redis.io/ 单机安装Redis 1.1.安装Redis依…

【IP地址与子网掩码】如何计算网络地址、广播地址、地址范围、主机个数、子网数(附详解与习题)

【写在前面】其实很多时候通过IP地址和子网掩码计算其网络地址、广播地址、可用IP&#xff0c;地址范围&#xff0c;主机数啥的&#xff0c;有些人不太清楚规则就只能瞎猜了&#xff0c;但是作为一个网络管理员还是一个基础常识的&#xff0c;这不因为最近备考网络管理员&#…

【数据结构】八大排序(二)

&#x1f61b;作者&#xff1a;日出等日落 &#x1f4d8; 专栏&#xff1a;数据结构 在最黑暗的那段人生&#xff0c;是我自己把自己拉出深渊。没有那个人&#xff0c;我就做那个人。 …

API接口的对接流程和注意事项

一、对接API数据接口的步骤通常包括以下几个部分&#xff1a; 了解API&#xff1a;首先需要详细了解API的基本信息、请求格式、返回数据格式、错误码等相关信息。可以查看API的官方文档或者使用API探索工具。同时&#xff0c;还需要明确数据请求的频率和使用权限等限制。 ​​测…

恐怖,又要有多少人下岗!AI零成本设计主图,渗入10万亿电商市场

在电商平台上&#xff0c;主图是吸引消费者点击进入商品详情页的重要因素之一。 一张高点击的电商主图&#xff0c;不仅要能够吸引消费者的眼球&#xff0c;还要能够清晰地展示产品的特点和卖点。下面是一些制作高点击电商主图的建议。 1. 突出产品特点&#xff1a;在制作主图…

【Spring】Spring的事务管理

目录 1.Spring事务管理概述1.1 事务管理的核心接口1. PlatformTransactionManager2. TransactionDefinition3. TransactionStatus 1.2 事务管理的方式 2.声明式事务管理2.1 基于XML方式的声明式事务2.2 基于Annotation方式的声明式事务 1.Spring事务管理概述 Spring的事务…