Mysql高级篇(中)——SQL性能分析

Mysql高级篇(中)—— SQL性能分析

  • 一、(了解)MySQL Query Optimizer 的主要功能和原理
  • 二、(了解)MySQL 常见瓶颈
  • 三、关键字 EXPLAIN
    • 1、是什么
    • 2、基本语法
    • 3、EXPLAIN 执行信息详解
      • (1)id
      • (2)select_type
        • (理解)无法缓存
        • (理解)物化子查询
      • (3)table
      • (4)partitions
      • (5)type
      • (6)possible_keys
      • (7)key
      • (8)key_len
      • (9)ref
      • (10)rows
      • (11)filtered
      • (12)Extra
        • 理解 Using index condition

一、(了解)MySQL Query Optimizer 的主要功能和原理

MySQL Query OptimizerMySQL 用来决定如何高效执行 SQL 查询的核心组件,它会基于查询的逻辑结构、表的统计信息、索引的使用等多种因素来选择最佳的执行计划。理解 Query Optimizer 的工作原理对于提高查询性能非常重要。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、(了解)MySQL 常见瓶颈

MySQL 常见瓶颈 通常分为以下几个方面,涵盖了 硬件资源、数据库配置、查询设计、以及并发处理 等问题。识别和解决这些瓶颈可以显著提高 MySQL 性能。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述



总结来说,MySQL 常见瓶颈通常与硬件资源(CPU、内存、磁盘)查询设计(索引、锁、事务)以及数据库配置相关。通过监控、分析执行计划、调整配置和优化查询,可以有效解决这些瓶颈并提升数据库性能。


三、关键字 EXPLAIN

1、是什么

EXPLAIN 关键字是 MySQL 中用于分析查询执行计划的工具帮助开发者了解查询语句是如何被优化器执行的。通过 EXPLAIN,可以 获得关于表的访问顺序索引使用情况连接方式等详细信息,从而有针对性地优化查询。

2、基本语法

EXPLAIN + SQL 语句

  • 执行 EXPLAIN 后,MySQL 会输出一张表,显示查询各个部分的执行计划。这个输出的结果可以帮助理解查询在数据库中的执行路径。

执行计划包含的信息

信息作用简述
id标识 查询中每个步骤的顺序
select_type标识 查询的类型,描述查询是简单查询、联合查询,还是子查询。
table表示查询中 正在访问的表
partitions显示查询涉及的表分区(如果
type描述 MySQL 访问表的方式,反映 查询的效率
possible_keys列出查询中 可能使用的索引
key显示实际被优化器选择用于查询的索引
key_len表示 MySQL 使用的索引长度(单位为字节)
ref显示 哪个字段或常量与索引列进行比较
rows优化器估计需要读取的行数
filtered显示通过 WHERE 子句过滤后的行百分比(0-100%)
Extra提供关于查询执行的额外信息,特别是某些性能影响因素的提示

在这里插入图片描述

3、EXPLAIN 执行信息详解

(1)id

MySQLEXPLAIN 输出中,id 列用于表示查询的执行步骤和顺序。对于复杂的查询,尤其是涉及多个子查询或联合查询时id 列能够帮助你理解 每个查询部分的执行流程及其依赖关系

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


==通过 `id` 的递增顺序,可以清楚地了解`查询的执行流程`,尤其是在`多表连接、子查询或联合查询`的情况下,帮助确定 `MySQL` 在执行查询时的`实际步骤和顺序`。这对查询优化特别重要,可以`帮助你识别哪些部分的查询是性能瓶颈或需要重构`的。==

(2)select_type

select_type 是帮助理解复杂查询执行方式的重要信息,它 表明每个查询部分的类型,通过分析 select_type,可以识别出查询中的子查询、联合查询、依赖查询等类型,并结合索引和查询优化技术,提升查询性能

select_type值类型简述
SIMPLE没有子查询和联合(UNION)的简单查询
PRIMARY查询中最外层的查询
SUBQUERY子查询
DERIVED派生表(即 FROM 子句中的子查询)
UNION联合查询中的第二个或后续查询
UNION RESULT用于保存联合查询的结果集
DEPENDENT SUBQUERY依赖于外部查询的子查询
DEPENDENT UNION依赖外部查询的联合查询
UNCACHEABLE SUBQUERY不能被缓存的子查询
UNCACHEABLE UNION不能被缓存的联合查询
MATERIALIZED物化子查询,存储为临时表

示例参考:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


EXPLAIN SELECT name FROM employees WHERE age IN (SELECT age FROM employees WHERE department_id = employees.department_id);

在这里插入图片描述


EXPLAIN
SELECT id FROM employees WHERE department_id = (SELECT department_id FROM departments WHERE manager_id = employees.manager_id)
UNION
SELECT id FROM employees WHERE department_id = 3;

在这里插入图片描述
在这里插入图片描述


EXPLAIN SELECT * FROM employees WHERE id IN (SELECT id FROM (SELECT id FROM employees WHERE age > 30) AS temp);

在这里插入图片描述

(理解)无法缓存

无法缓存(Uncacheable) 是指某些查询结果无法被数据库缓存或重用,因此每次执行查询时,都会重新计算这些结果。 数据库通常会缓存一些查询的结果,以便在相同的查询再次执行时直接返回缓存的结果,避免重复计算。然而,当查询的某些部分是动态的、不可预测的或依赖外部因素时,数据库无法缓存这些结果,必须每次重新计算。

无法缓存的原因

  1. 非确定性函数:使用了每次执行时都会返回不同结果的函数,比如 RAND()、NOW()、UUID() 等。这些函数的输出是不可预测的,无法缓存。

  2. 依赖外部变量:查询依赖于外部输入(如用户输入的变量)或会话状态,使得每次执行时,输入可能不同。

  3. 外部数据源:查询可能依赖外部数据源(如外部表或临时生成的数据),这些数据在每次执行
(理解)物化子查询

在这里插入图片描述

SELECT e.name, e.salary
FROM employees e
WHERE e.department_id IN (SELECT department_idFROM departmentsWHERE manager_id > 100
) 
AND e.department_id IN (SELECT department_idFROM departmentsWHERE manager_id > 100
);

在这个查询中,子查询 SELECT department_id FROM departments WHERE manager_id > 100 被多次使用。通常,数据库会在每次遇到该子查询时重新执行一次。但是如果数据库能够将该子查询的结果“物化”,即存储在一个临时表中,那么它只需要执行一次子查询,并且可以在后续查询中直接使用物化的结果,从而提高查询效率。

(3)table

table 列显示了查询中正在处理的派生表的名称

(4)partitions

在这里插入图片描述
在这里插入图片描述

CREATE TABLE orders (id INT,order_date DATE,customer_id INT,amount DECIMAL(10,2)
)
PARTITION BY RANGE (YEAR(order_date)) (PARTITION p2019 VALUES LESS THAN (2020),PARTITION p2020 VALUES LESS THAN (2021),PARTITION p2021 VALUES LESS THAN (2022)
);
-- 查询该表中 2020 年的订单:
EXPLAIN SELECT * FROM orders WHERE order_date BETWEEN '2020-01-01' AND '2020-12-31';

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(5)type

EXPLAIN 命令的输出信息包含了一列 type,这列用于 显示数据库在执行查询时所使用的访问方法(或称访问类型)type 是优化查询性能的重要指标,它展示了查询如何访问表中的数据,以及查询是否使用了索引、全表扫描等。通过分析 type 列,我们可以了解查询的效率,并决定是否需要进行优化。

type常见值序号(1~7对应的type列的值表示效率从低到高
ALL1
index2
range3
ref4
eq_ref5
const/system6
NULL7

每种类型的访问方式代表 数据库如何检索数据,越靠前的值表示性能越差,越靠后的值表示性能越好

示例详解

  • 假设有两个表 usersorders 结构如下:
    users 记录用户信息,表 orders 记录订单信息,其中 orders.user_id 是外键,关联到 users.id
CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(100),age INT
);CREATE TABLE orders (id INT PRIMARY KEY,user_id INT,order_date DATE,amount DECIMAL(10, 2),INDEX (user_id)
);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(6)possible_keys

possible_keys,它列出了在执行查询时可能使用的索引; 它与key 的关系: key表示查询执行时实际使用的索引

  • 定义: possible_keys 是指 MySQL优化查询时认为可能适用的索引。如果 possible_keys 为空(NULL),表示没有索引被认为是合适的,意味着优化器将进行全表扫描。

  • 影响因素: possible_keys 受查询的 WHERE 条件JOIN 条件ORDER BYGROUP BY 等影响。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(7)key

key,它显示了数据库优化器在查询执行过程中实际选择使用的索引,而不仅仅是可能使用的(这由 possible_keys 字段列出)。

  • 定义: key 表示数据库在查询执行过程中实际使用的索引。这个值能够帮助你了解数据库引擎是否正确地使用了索引,以提升查询性能。

  • possible_keys 的关系: possible_keys 列出所有可能的索引,而 key 则表示查询执行时实际使用的索引。如果 key 为空,表示查询没有使用索引,通常会导致全表扫描。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(8)key_len

key_lenMySQL 在生成查询计划时,使用的索引字段的最大可能字节数。 它反映了 MySQL 根据索引结构、字段类型以及查询条件所估算的索引长度。 需要注意的是,key_len 并不表示实际执行时的动态使用长度,而是静态估算值。


在这里插入图片描述


key_len 示例分析: 假设有一个 employees 表结构如下:

CREATE TABLE employees (emp_id INT PRIMARY KEY,first_name VARCHAR(50),last_name VARCHAR(50),department_id INT,salary DECIMAL(10, 2),INDEX idx_name_dept (first_name, department_id)
);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(9)ref

ref 列主要用于描述表与表之间是如何通过索引关联的, 即在执行查询时,某个表中的列是如何与另一个表中的索引列进行比较的。

ref 列显示的是查询中的列或常量如何与索引字段匹配,通常会在多表连接(JOIN)查询中体现。它的值可以是常量列名NULL 等,用于指示索引匹配的方式


在这里插入图片描述

CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(100)
);CREATE TABLE orders (id INT PRIMARY KEY,user_id INT,amount DECIMAL(10, 2),INDEX (user_id)
);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(10)rows

rows 表示 MySQL 在执行查询时,预估需要扫描的记录行数。这一列的数据基于统计信息,并 不代表最终的实际行数,而是 MySQL 用来估算查询成本的依据。


在这里插入图片描述

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100),department_id INT,INDEX (department_id)
);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(11)filtered

filtered 列表示 查询结果中的行在每个步骤中剩余的比例 即经过 WHERE 子句过滤后,剩下的行数占总扫描行数的百分比。这个值可以帮助判断过滤条件的有效性值越接近 100%,说明条件过滤效果差,越接近 0%,说明条件过滤得非常严格

filtered 列的值是一个百分比(0 到 100),它的计算基于 MySQL 对表中数据的统计信息和查询的过滤条件,并不表示实际扫描或返回的行数,而是预估的比例


在这里插入图片描述

CREATE TABLE employees (id INT PRIMARY KEY,name VARCHAR(100),department_id INT,salary DECIMAL(10, 2),INDEX (department_id)
);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(12)Extra

ExtraEXPLAIN 输出中的一个字段,它提供了有关查询执行过程中额外的详细信息 Extra 字段中的信息可以揭示 MySQL 在查询执行时做出的特殊操作或优化决策,这些信息有助于理解查询的性能表现,并能帮助找出潜在的优化点。

常见的 Extra 字段输出及其含义
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

理解 Using index condition

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

HTML 转 PDF API 接口

HTML 转 PDF API 接口 网络工具 / 文件处理 支持网页转 PDF 高效生成 PDF / 提供永久链接。 1. 产品功能 超高性能转换效率;支持将传递的 HTML 转换为 PDF,支持转换 HTML 中的 CSS 格式;支持传递网站 URL,直接转换页面成对应的 …

代码随想录打卡Day31

又是难绷的一天啊,第二题和第三题看完视频才AC的,第一道题又被官方测试样例恶心了,下面细说。 56. 合并区间 这道题没有什么新的思路,还是先将区间按照区间左值排序,然后遍历向量中的每一个区间,如果和前…

在职研生活学习--20240907

开学第一天 9月7日,中南大学商学院迎来了一支充满活力的队伍——2024级MBA新生集体整装待发,我们满怀期待地登上了前往长沙望城柏乐园的大巴,准备开启一场为期两天一夜的素质拓展与团队建设之旅。 迎新幼儿园PPT 出发 抵达柏乐园,…

Docker torchserve 部署模型流程

1.拉取官方镜像 地址: https://hub.docker.com/r/pytorch/torchserve/tags docker pull pytorch/torchserve:0.7.1-gpu2. docker启动指令 CPU docker run --rm -it -d -p 8380:8080 -p 8381:8081 --name torch-server -v /path/model-server/extra-files:/home/model-serve…

食品分类2检测系统源码分享

食品分类2检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vi…

应用层协议 —— https

目录 http的缺点 https 安全与加密 运营商挟持 常见的加密方式 对称加密 非对称加密 数据摘要(数据指纹) 不安全加密策略 1 只使用对称加密 2 只使用非对称加密 3 双方都是用非对称加密 4 对称加密和非对称加密 解决方案 CA证书 http的缺点 我们可…

HarmonyOS开发实战( Beta5.0)骨架屏实现案例实践

鸿蒙HarmonyOS开发往期必看: HarmonyOS NEXT应用开发性能实践总结 最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通) 介绍 本示例介绍通过骨架屏提升加载时用户体验的方法。骨架屏用…

STM32+FATFS+SD卡+RTC(生成.CSV格式文件)

一、简介 实验目的:在SD卡上挂载文件系统,实时记录压力传感器采集到的数据;且在表格第一排记录采集时间; 因为前面文章包含了除RTC之外的所有的代码,此文章只放RTC代码。 二、工程源码 RTC.c #include "sys.h…

cocosCreator实现一个验证码弹窗验证功能

公开文章地址 在 Cocos Creator 中实现一个6位数的验证码输入弹窗功能。主要包含以下三点 1、 可以连续输入验证码 2、 可以粘贴验证码 3、 可以连续删除验证码 前言 引擎版本: Cocos Creator 2.7.2 开发语言: ts 效果图 实现思路 1、 在弹窗界面放置6个输入框的精灵&#x…

828华为云征文 | 使用华为云Flexus云服务器X安装搭建crmeb多门店商城教程

🚀【商城小程序,加速启航!华为云Flexus X服务器助力您的业务腾飞】🚀 1、点击链接进入华为云官网,页面如下: 华为云Flexus云服务器X选购页面 https://www.huaweicloud.com/product/flexus-x.html 2、进…

Linux下编译Kratos

本文记录在Linux下编译Kratos的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1Boost1.74.0oneAPI2024.2.1 一、依赖与代码 1.1 安装依赖 apt-get update apt-get install vim openssh-server openssh-client ssh \build-essential …

初级练习[3]:Hive SQL子查询应用

目录 环境准备看如下链接 子查询 查询所有课程成绩均小于60分的学生的学号、姓名 查询没有学全所有课的学生的学号、姓名 解释: 没有学全所有课,也就是该学生选修的课程数 < 总的课程数。 查询出只选修了三门课程的全部学生的学号和姓名 环境准备看如下链接 环境准备h…

spring项目整合log4j2日志框架(含log4j无法打印出日志的情况,含解决办法)

Spring整合Log4j2的整体流程 Lo 1&#xff09;导入log4j-core依赖 <!--导入日志框架--> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <ver…

Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)

导航&#xff1a; 【Java笔记踩坑汇总】Java基础JavaWebSSMSpringBootSpringCloud瑞吉外卖/谷粒商城/学成在线设计模式面试题汇总性能调优/架构设计源码解析 推荐视频&#xff1a; 黑马程序员全套Java教程_哔哩哔哩 尚硅谷Java入门视频教程_哔哩哔哩 推荐书籍&#xff1a; 《Ja…

OpenHarmony鸿蒙开发( Beta5.0)智能油烟机开发实践

样例简介 本Demo是基于Hi3516开发板&#xff0c;使用开源OpenHarmony开发的应用。本应用主要功能有&#xff1a; 可以搜索本地指定目录的图片和视频文件&#xff0c;并可进行点击播放。 可以通过wifi接收来自手机的美食图片以及菜谱视频&#xff0c;让我们对美食可以边学边做…

GEE 迭代删除谷歌资产文件夹

在Google Earth Engine (GEE) 中管理大量地理空间数据时&#xff0c;我们可能会遇到需要清理不再需要的资产的情况。但需要提前删除子文件后才可删除文件夹&#xff0c;才可释放存储空间&#xff0c;删除过时的数据。本文将介绍如何在GEE中迭代删除资产文件夹。 代码详解 以下…

【Redis】Redis 典型应用 - 缓存 (Cache) 原理与策略

目录 Redis 典型应⽤ - 缓存 (cache)什么是缓存使⽤ Redis 作为缓存缓存的更新策略1)定期⽣成2)实时生成 缓存预热&#xff0c;缓存穿透&#xff0c;缓存雪崩 和 缓存击穿关于缓存预热 (Cache preheating)什么是缓存预热 关于缓存穿透 (Cache penetration)什么是缓存穿透为何产…

网络安全学习路线图(2024版详解)

近期&#xff0c;大家在网上对于网络安全讨论比较多&#xff0c;想要学习的人也不少&#xff0c;但是需要学习哪些内容&#xff0c;按照什么顺序去学习呢&#xff1f;其实我们已经出国多版本的网络安全学习路线图&#xff0c;一直以来效果也比较不错&#xff0c;本次我们针对市…

树莓派!干农活!

农作物种植是一个需要精准操作的行业&#xff0c;而农业的长期趋势是朝着机械化方向发展。Directed Machines公司的土地护理机器人&#xff08;Land Care Robot&#xff09;&#xff0c;基于Raspberry Pi4和RP2040构建&#xff0c;是解放稀缺人力资本的一种经济高效方式。 Dir…

用Matlab求解绘制2D散点(x y)数据的最小外接矩形

用Matlab求解绘制2D散点&#xff08;x y&#xff09;数据的最小外接矩形 0 引言1 原理介绍及实现2 完整代码及相关函数3 结语 0 引言 散点/多边形的外接图形是确定模型轮廓或姿态的一种可视化方法&#xff0c;也是有很大的用途的。前面已经介绍过两种简单的散点 ( x , y ) {(x,…