MySQL-执行计划、explain关键字查询执行计划以及explain案例分析

news2024/10/6 16:27:42

一、执行计划

MySQL 的执行计划(Execution Plan)是数据库查询优化器生成的一种指导性信息,它描述了 MySQL 执行查询时所采用的具体执行策略。执行计划通常由 MySQL 的查询优化器根据查询语句、表结构、索引等信息进行生成,并且用于指导 MySQL 数据库引擎执行查询操作

下面是 MySQL 执行计划的一般生成过程和主要内容

  1. 查询解析与语法分析

    • MySQL 首先对查询语句进行解析和语法分析,以确定查询的语义和语法是否正确。如果语句无法通过解析或语法分析阶段,MySQL 将返回相应的错误信息
  2. 查询优化

    • 确定查询语句的语法正确后,MySQL 的查询优化器开始优化查询。优化过程包括但不限于以下几个方面:
      • 表的访问顺序:优化器决定查询中各个表的访问顺序以尽可能减少查询中需要访问的数据量(确定驱动表、被驱动表)
      • 索引选择:优化器确定是否使用索引以及使用哪个索引来执行查询,以加速数据检索
      • 连接算法对于连接查询(如 INNER JOIN、LEFT JOIN 等),优化器选择合适的连接算法来执行连接操作,以提高查询效率
      • 子查询优化对于存在子查询的查询语句,优化器会尝试将其转换为更高效的方式来执行
      • 其他优化策略:优化器可能还会考虑一些其他的优化策略,如临时表的使用、排序策略等
  3. 生成执行计划

    • 完成查询优化后MySQL 的查询优化器将生成执行计划。执行计划是一个执行查询的具体步骤序列,它描述了 MySQL 数据库引擎在执行查询时的具体策略和顺序。
  4. 执行查询

    • MySQL 数据库引擎根据生成的执行计划,执行查询操作。执行计划中的每一步都对应着一个具体的执行操作,如全表扫描、索引扫描、连接操作等。数据库引擎会按照执行计划中的步骤顺序执行查询,并且根据需要将中间结果暂存到临时表中。
  5. 返回结果

    • 当查询执行完成后,MySQL 数据库引擎将查询结果返回给客户端。客户端可以根据查询结果来进行相应的后续处理。

二、explain关键字——查询执行计划

EXPLAIN 是 MySQL 中用于查看查询执行计划的关键字,通过执行 EXPLAIN 可以获取查询的执行计划信息。EXPLAIN 输出的结果是一组记录,每条记录包含一些字段,这些字段提供了关于查询执行计划的详细信息。下面是 EXPLAIN 输出结果中每种字段的作用和分类:

  1. id

    • 这是每个查询操作在执行计划中的唯一标识符。如果查询中包含子查询或联合查询等复杂结构,可能会有多个 id。
  2. select_type

    • 表示查询的类型,常见的有:
      • SIMPLE:简单的 SELECT 查询,不包含子查询或 UNION。
      • PRIMARY:主查询(外层查询)。
      • SUBQUERY:子查询。
      • UNION:UNION 查询。
      • DERIVED:派生表查询,表示从 FROM 子句中派生出的临时表。
      • UNION RESULT:UNION 查询的结果。
  3. table

    • 表示查询操作涉及的表名。如果查询使用了别名,则显示别名
  4. type

    • 表示访问表的方式,常见的有:
      • const:通过常量条件进行检索,通常是主键或唯一索引的等值查询。
      • eq_ref:使用索引进行连接,且连接条件是唯一索引。
      • ref:使用非唯一索引进行连接。
      • range:通过范围查找,通常出现在带有范围条件(如 BETWEEN、IN)的查询中。
      • index:全索引扫描,访问全表索引,但不需要读取实际的数据行。
      • all:全表扫描,需要遍历整张表。
  5. possible_keys

    • 表示可能应用到查询中的索引列表,这是一个提示性信息,不一定实际使用到了所有的索引。
  6. key

    • 表示实际使用到的索引。如果该值为 NULL,则表示没有使用到索引。
  7. key_len

    • 表示索引使用的长度。如果使用了复合索引,该字段表示索引使用的总长度。
  8. ref

    • 表示对索引的哪个列进行了引用。常见的有列名、常量等。
  9. rows

    • 表示 MySQL 估计需要扫描的行数。这是一个估算值,不一定与实际扫描的行数完全相符。
  10. filtered

    • 表示在某个表上执行条件过滤的百分比越大,数据越精确
  11. Extra

    • 表示额外的信息,常见的有:
      • Using index:表示使用了覆盖索引,查询只用到了索引而不需要访问表。
      • Using where:表示使用了 WHERE 条件过滤。
      • Using temporary:表示使用了临时表。
      • Using filesort:表示使用了文件排序。

通过分析 EXPLAIN 输出的结果,可以了解查询的执行计划、访问方式、是否使用了索引、是否存在性能瓶颈等信息,从而优化查询语句和索引设计,提高查询性能。

三、使用explain案例

假设有以下表结构:

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    age INT,
    email VARCHAR(100),
    INDEX idx_age (age),
    INDEX idx_name_email (name, email)
);

现在我们来分析几个查询语句的执行计划:

  1. 简单的等值查询
EXPLAIN SELECT id,name,age FROM users WHERE id = 1;

在这里插入图片描述

  • type 是 const,表示使用了常量条件进行检索,因为是根据主键等值查询,所以性能很高。
  • key 是 PRIMARY,表示使用了主键索引。
  • rows 是 1,表示 MySQL 只需扫描 1 行数据。
  1. 使用索引的范围查询
EXPLAIN SELECT id,name,age FROM users WHERE age > 30;

在这里插入图片描述

  • type 是 ALL,表示使用了全表查找,这里理论上type=range,但是优化器也会将数据量作为参考的标准,数据量小,走索引便没有必要了,毕竟索引维护也需要成本
  • possible_key 是 idx_age,表示可供选择的索引:有 age 列的索引。
  • rows 是 估算的行数,表示 MySQL 需要扫描的行数。
  1. 使用覆盖索引的查询
EXPLAIN SELECT name, email FROM users WHERE age > 30;
  • type 是 index,表示使用了索引扫描。
  • key 是 idx_age,表示使用了 age 列的索引。
  • Extra 中有 Using index,表示查询只使用了索引而不需要访问表数据。
  1. 多列索引的查询
EXPLAIN SELECT * FROM users WHERE name = 'Alice' AND email = 'alice@example.com';

在这里插入图片描述

  • type 是 ref,表示使用了非唯一索引进行连接。
  • key 是 idx_name_email,表示使用了 name 和 email 列的联合索引。
  • rows 是 估算的行数,表示 MySQL 需要扫描的行数。
  1. 联合查询
EXPLAIN SELECT id,name,age,email FROM users WHERE age > 30 UNION SELECT * FROM users WHERE name = 'Alice';

在这里插入图片描述

  • select_type 是 union,表示使用了 UNION 查询。
  • keyExtra 字段显示的信息与各个子查询类似。
  1. 带有连接条件的联合查询
EXPLAIN SELECT u1.name,u1.age,u1.email FROM users u1 INNER JOIN users u2 ON u1.age = u2.age WHERE u1.name = 'Alice';

在这里插入图片描述

  • type 是 ref,表示使用了非唯一索引进行连接。
  • key 是 idx_age,表示使用了 age 列的索引。
  • rows 是 估算的行数,表示 MySQL 需要扫描的行数。
  1. 子查询
EXPLAIN SELECT id,name,age,email FROM users WHERE age > (SELECT AVG(age) FROM users);

在这里插入图片描述

  • 主查询的 type 是 range,表示使用了范围查找。
  • 子查询的 type 与具体情况有关,可能是 subquery 或 derived。
  • keyrows 字段显示的信息与主查询类似。
  1. 使用函数的查询
EXPLAIN SELECT id,name,age,email FROM users WHERE SUBSTRING(name, 1, 1) = 'A';

在这里插入图片描述

  • type 是 ALL,表示使用了全表扫描。
  • Extra 中有 Using where,表示查询使用了 WHERE 条件过滤。
  • 使用了函数对值或者格式进行修改了,不走索引

通过分析这些查询语句的 EXPLAIN 输出,我们可以了解到更复杂查询的执行计划、访问方式、是否使用了索引等信息。这些信息可以帮助我们优化查询语句、索引设计以及数据库结构,从而提高查询性能。

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

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

相关文章

基于Docker for Windows部署ChatGPT-Next-Web

基于Docker for Windows部署ChatGPT-Next-Web 项目地址安装Docker for Windows部署项目参数讲解参数示例 运行 项目地址 https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web 安装Docker for Windows 官网地址:https://www.docker.com/ 下拉找到Download 选择W…

Error: TF_DENORMALIZED_QUATERNION: Ignoring transform forchild_frame_id

问题 运行程序出现: Error: TF_DENORMALIZED_QUATERNION: Ignoring transform for child_frame_id “odom” from authority “unknown_publisher” because of an invalid quaternion in the transform (0.0 0.0 0.0 0.707) 主要是四元数没有归一化 Eigen::Quatern…

CentOS 7 下离线安装RabbitMQ教程

CentOS 7 下安装RabbitMQ教程一、做准备(VMWare 虚拟机上的 CentOS 7 镜像 上安装的) (1)准备RabbitMQ的安装包(rabbitmq-server-3.8.5-1.el7.noarch)下载地址mq https://github.com/rabbitmq/rabbitmq-se…

使用C++调用讯飞星火API的详细指南

正文: 科大讯飞是中国领先的人工智能公司,其讯飞星火API为开发者提供了丰富的接口和服务,支持各种语音和语言技术的应用。下面是使用C接入讯飞星火API的步骤和代码示例。 步骤一:注册账号并创建应用 首先,您需要访问科…

leetCode刷题 25.K 个一组翻转链表

目录 1.思路: 2.解题方法: 3.复杂度: 4.Code 题目: 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不…

Medium 级别存储型 XSS 攻击演示(附链接)

环境准备 DVWA 靶场https://eclecticism.blog.csdn.net/article/details/135834194?spm1001.2014.3001.5502 测试 打开页面 输入正常值观察 一样的,用户名做了长度限制 更改后输入 HTML 标签语句测试 一样没有做过滤,接下来试试 JS 恶意代码 发现只…

Linux(05) Debian 系统修改主机名

查看主机名 方法1:hostname hostname 方法2:cat etc/hostname cat /etc/hostname 如果在创建Linux系统的时候忘记修改主机名,可以采用以下的方式来修改主机名称。 修改主机名 注意,在linux中下划线“_”可能是无效的字符&…

zabbix图表时间与服务器时间不一致问题

部署完zabbix后,有时候会发现zabbix服务器的时间明明是对的,但是图标的时间不对,通过以下的配置可以快速解决。 登录zabbix-nginx容器 docker exec -u root -it docker-compose-zabbix-zabbix-web-nginx-mysql-1 bash修改php配置文件 vi /e…

合并两个单链表

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 但行前路,不负韶华&#…

【Mysql】一文解读【事务】-【基本操作/四大特性/并发事务问题/事务隔离级别】

前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C Linux的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…

使用 FinalShell 进行远程连接(ssh 远程连接 Linux 服务器)

目录 前言 基本使用教程 新建远程连接 连接主机 自定义命令 路由追踪 前言 后端开发,必然需要和服务器打交道,部署应用,排查问题,查看运行日志等等。一般服务器都是集中部署在机房中,也有一些直接是云服务器&am…

Spring Boot接收从前端传过来的数据常用方式以及处理的技巧

一、params 传参 参数是会拼接到url后面的请求 场景规范:url后面的key值<=3个参数的时候,使用params 传参 支持的请求方式:get(正规的是get方式)、post 都行 例如: http://localhost:8080/simpleParam?name=Tom&age=10 在postman里面的体现为 后端接收的接口…

AKF扩展立方体和AKF可用性立方体

很多人知道AKF扩展立方体是从《架构即未来》这本书开始。实际上akfpartners官方写过4篇关于AKF扩展立方体的文章&#xff0c;还有一篇介绍AKF可用性立方体。akfpartners官方在高可用、扩展性方面有很多专业技术文章&#xff0c;建议有空就翻翻看。 AKF扩展立方体和AKF可用性立方…

AAC相关知识

一、AAC音频格式种类有哪些 AAC音频格式是一种由MPEG-4标准定义的有损音频压缩格式。AAC包含两种封装格式 ADIF&#xff08;Audio Data Interchange Format音频数据交换格式&#xff09;和ADTS&#xff08;Audio Data transport Stream音频数据传输流&#xff09;。 ADIF 特点…

最简单的 AAC 音频码流解析程序

最简单的 AAC 音频码流解析程序 最简单的 AAC 音频码流解析程序原理源程序运行结果下载链接参考 最简单的 AAC 音频码流解析程序 参考雷霄骅博士的文章&#xff1a;视音频数据处理入门&#xff1a;AAC音频码流解析 本文中的程序是一个AAC码流解析程序。该程序可以从AAC码流中…

Lafida多目数据集实测

Lafida 数据集 paper&#xff1a;J. Imaging | Free Full-Text | LaFiDa—A Laserscanner Multi-Fisheye Camera Dataset 官网数据&#xff1a;https://www.ipf.kit.edu/english/projekt_cv_szenen.php 官网&#xff1a;KIT-IPF-Software and Datasets - LaFiDa 标定数据下载&…

解析Flutter应用在iOS环境中的性能优化技巧

本文探讨了使用Flutter开发的iOS应用能否上架&#xff0c;以及上架的具体流程。苹果提供了App Store作为正式上架渠道&#xff0c;同时也有TestFlight供开发者进行内测。合规并通过审核后&#xff0c;Flutter应用可以顺利上架。但上架过程可能存在一些挑战&#xff0c;因此可能…

Javascript/Node.JS中如何用多种方式避免属性为空(cannot read property of undefined ERROR)

>>>>>>问题 "cannot read property of undefined" 是一个常见的 JavaScript 错误&#xff0c;包含我在内很多人都会遇到&#xff0c;表示你试图访问一个未定义&#xff08;undefined&#xff09;对象的属性。这通常是因为你在访问一个不存在的对象…

【QT+QGIS跨平台编译】056:【pdal_kazhdan+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_kazhdan介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_kazhdan介绍 pdal_kazhdan 是 PDAL(Point Data Abstraction Library)相关的 Kazhdan 算法的实现。PDAL 是一个用于处理和分析点云数据的开源库,而 Kazhdan 算法通常…

MySQL之索引详细总结

索引简介 索引是帮助MySQL高效获取数据的数据结构(有序)。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用(指向)数据&#xff0c;这样就可以在这些数据结构上实现高级查法&#xff0c;这种数据结构就是索引 为什…