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

news2024/11/18 3:21:05

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_id
    FROM departments
    WHERE manager_id > 100
) 
AND e.department_id IN (
    SELECT department_id
    FROM departments
    WHERE 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.coloradmin.cn/o/2119558.html

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

相关文章

Windows--linux共享文件夹

1、如果共享文件夹设置在Windows上面 文件夹设置 个人家里电脑通常不设置用户名密码 linux端mount命令行 mount -t cifs -o usernamewade,vers3.0 //192.168.0.143/openvswitch-2.17.10 /root/windows

计算机专业选题推荐-基于python的岗位兼职招聘平台【python-爬虫-大数据定制】

💖🔥作者主页:毕设木哥 精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻 实战项目 文章目录 实战项目 一、基于python的岗位兼职招聘平…

我的第3个AI项目-Advanced RAG with Gemma, Weaviate, and LlamaIndex

目录 一、项目简介概述时间kaggle地址(代码和详细注解)主要工作和收获技术栈数据集结果 二、bug修复在 Kaggle 使用模型时需要先同意该模型的使用条款使用 GPU 时显存不足把 Weaviate 从V3升级到V4改动一:创建client改动二:判断某…

网络编程day02(字节序、TCP编程)

目录 【1】字节序 1》大小端转换 2》端口转换 3》IP地址转换 主机字节序转换为网络字节序 (小端序->大端序) 网络字节序转换为主机字节序(大端序->小端序) 【2】TCP编程 1》流程 2》函数接口 1> socket 2> …

免费的 Mac 应用清理工具Pearcleaner v3.8.6

免费的 Mac 应用清理工具。这是一款免费开源的 Mac 应用清理工具,能够彻底卸载应用并清理残留文件。它采用 SwiftUI 开发,提供了简单易用的界面,支持右键卸载、迷你模式和 Homebrew 清理等功能。 下载链接:https://pan.quark.cn/s…

【Visual Studio 报错】vs 在使用二进制写入文件时弹窗报错:使用简体中文 gb2312 编码加载文件

如以下报错 解决办法 解决方法:文件->高级保存选项->将文件编码形式改为“UTF-8带签名” 若找不到高级保存选项,可以跟着下面路径把该选项调出来 :工具->自定义->命令->菜单栏中改成文件->预览右边点添加命令->类别中…

BRAM IP Native模式使用

简介 BRAM(‌Block RAM)是‌FPGA(Field-Programmable Gate Array)中的一种专用RAM资源,固定分布在FPGA内部的特定位置。该内容主要对BRAM(Block RAM”的缩写)Native模式下IP界面做详细描述和使用…

C语言进阶版第9课—指针(3)

文章目录 1. 字符指针变量2. 数组指针变量3. 二维数组传参的本质4. 函数指针变量5. typedef关键字6. 函数指针数组7. 函数指针数组的应用—转移表 1. 字符指针变量 练习题 2. 数组指针变量 在学习数组指针前,我们先回忆一下什么是指针数组指针数组 → 存放指针的数…

基于单片机的人脸识别的智能门禁系统设计

文章目录 前言资料获取设计介绍功能介绍设计清单核心代码具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等…

Unity Addressables 使用说明(一)概述

使用 Adressables 组织管理 Asset Addressables 包基于 Unity 的 AssetBundles 系统,并提供了一个用户界面来管理您的 AssetBundles。当您使一个资源可寻址(Addressable)时,您可以使用该资源的地址从任何地方加载它。无论资源是在…

【C++ Primer Plus习题】14.2

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream> #include "wine.h" …

【PWN · 栈溢出 | GOT劫持】[2024 · 长城杯]consumption

通过代码审计&#xff0c;找到栈溢出漏洞点&#xff0c;覆盖关键栈变量&#xff0c;实现任意地址写 前言 本题主要是套壳了Cjson&#xff0c;实则是约定了输入格式。通过仔细代码审计&#xff0c;即可找到栈溢出&#xff0c;并实现利用 一、题目 查阅网上资料&#xff0c;得知…

如何提取视频中的音频?新手也能轻松搞定

在数字媒体处理中&#xff0c;从视频文件中提取音频是一个常见需求。无论你是希望为视频制作单独的音频版本&#xff0c;还是想将某段视频的背景音乐用于其他项目&#xff0c;掌握音频提取技术都至关重要。本文将详细介绍几种提取视频中音频的方法&#xff0c;帮助你轻松实现这…

【自考zt】【软件工程】【21.04】(部分)

一、单选 二、填空 三、简答 四、应用 小结&#xff1a;

DeepSeek缓存命中技术,成本降低10倍

DeepSeek系列升级&#xff1a; DeepSeek发布最新的缓存命中技术&#xff0c;有效降低成本至0.1元/百万tokens&#xff0c;适用于文件读取和固定提示词。 点评&#xff1a;由于token消耗大部分是在系统提示词中&#xff0c;妥善使用确实可以极大降低成本&#xff0c;同时还能保证…

音视频入门基础:WAV专题(11)——FFmpeg源码中计算WAV音频文件每个packet的pts_time、dts_time的实现

音视频入门基础&#xff1a;WAV专题系列文章&#xff1a; 音视频入门基础&#xff1a;WAV专题&#xff08;1&#xff09;——使用FFmpeg命令生成WAV音频文件 音视频入门基础&#xff1a;WAV专题&#xff08;2&#xff09;——WAV格式简介 音视频入门基础&#xff1a;WAV专题…

ssm微信小程序校园失物招领论文源码调试讲解

第二章 开发技术与环境配置 以Java语言为开发工具&#xff0c;利用了当前先进的SSM框架&#xff0c;以MyEclipse10为系统开发工具&#xff0c;MySQL为后台数据库&#xff0c;开发的一个微信小程序校园失物招领。 2.1 Java语言简介 Java是由SUN公司推出&#xff0c;该公司于20…

[git操作] git创建仓库上传github报错

操作流程如下 使用 git init使用 git remote add origin 项目ssh链接git add . 报错如下 Bus error (core dumped)然后执行任何别的操作都会报错&#xff1a; fatal: Unable to create path .. /.git/index.lock: File exists.Another git process seems to be running in …

​全国计算机软件中级资料分享

全国计算机软件中级资料分享 软考资料分析 软件设计师中间 免费资料 链接:https://pan.baidu.com/s/1GqbgIq_D0uZd-uuhIhG-Sg?pwd2atp 提取码:2atp 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 求个免费关注不过分吧。

vue实现评论滚动效果

vue插件实现滚动效果 一、安装组件 官网地址&#xff1a;https://chenxuan0000.github.io/vue-seamless-scroll/ 1、vue2安装 npm install vue-seamless-scroll --savevue3安装 npm install vue3-seamless-scroll --save二、组件引入 <template><div v-if"…