『Mysql』在Mysql中的执行计划超详细分析

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 📣读完这篇文章里你能收获到- Expalin数据库执行计划的概念- 执行计划细节分析过程

请添加图片描述
📣读完这篇文章里你能收获到

  • Expalin数据库执行计划的概念
  • 执行计划细节分析过程

请添加图片描述

看这篇文章前需要先了解一下以下几个小问题~

一、概念篇

1 什么是Explain

  • 分析sql语句执行计划。

2 为什么要使用Explain

  • 了解sql语句如何从表中查询到目标数据

请添加图片描述

二、Explain分析

1. 先执行Sql,然后通过Explain分析

  • 举例
EXPLAIN
SELECT * FROM `Seckills` AS `s`

2.然后分析语句详细细节

请添加图片描述

  • id: 查询的唯一标识
  • select_type: 查询的类型
  • table: 查询的表, 可能是数据库中的表/视图,也可能是 FROM 中的子查询
  • type: 搜索数据的方法
  • possible_keys: 可能使用的索引
  • key: 最终决定要使用的key
  • key_len: 查询索引使用的字节数。通常越少越好
  • ref: 查询的列或常量
  • rows: 需要扫描的行数,估计值。通常越少越好
  • extra: 额外的信息

3.执行计划-ID

select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序

有三种情况:
(1)id相同,执行顺序由上至下
(2)id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
(3)id有相同也有不同,同时存在

4.执行计划-select-type

  • SIMPLE: 简单查询,不包含子查询和union
  • PRIMRARY: 包含子查询时的最外层查询; 使用union时的第一个查询
  • UNION: 包含union的查询中非第一个查询
  • UNION RESULT 临时结果
  • DEPENDENT UNION: 与 UNION 相同,但依赖外层查询的结果
  • SUBQUERY: 子查询
  • DEPENDENT SUBQUERY: 依赖外层查询的子查询
  • DERIVED: 用于 FROM 中的子查询(中间表)

举例:
example1:联合查询

SELECT `a`.`ProductId` FROM `Seckills` AS `a` 
  union
SELECT `b`.`ProductId` FROM `Seckills` AS  `b` 
 union
SELECT `c`.`ProductId` FROM `Seckills` AS  `c`

请添加图片描述

example2:子查询

SELECT * FROM Seckills WHERE SeckillId = 
(SELECT SeckillId FROM seckillrecords WHERE SeckillNum = 1);

请添加图片描述

example3:子查询依赖查询

SELECT * FROM Seckills WHERE SeckillId = 
(SELECT SeckillId FROM seckillrecords WHERE SeckillNum = 1 and Seckills.SeckillId = seckillrecords.SeckillId);

请添加图片描述

5.执行计划-type

type 字段描述了查询的方式,从好到坏为:

  1. null: 不需要访问索引和表即可完成
    示例:

    SELECT 1;
  2. const: 表中仅有一行匹配,在分解查询计划时直接将其读出作为常量使用。system 是 const 类型的特例,通过直接匹配主键或者唯一约束的字段。
    示例:

    SELECT * FROM Seckills WHERE SeckillId = 4;

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| ---- | ----------- | ----- | ----- | ------------- | -------- | ------- | ----- | ---- | ----------- |
| 1 | SIMPLE | user | const | uni_name | uni_name | 258 | const | 1 | Using index |

  1. eq_ref: 使用 PRIMARY KEY 或 UNIQUE KEY 进行关联查询。
    示例:

       SLECT *
    FROM Seckills INNER JOIN seckillrecords 
    ON Seckills .SeckillId = seckillrecords .SeckillId 
    WHERE seckillrecords .SeckillNum = 1
    id select_type table type possible_keys key key_len ref rows Extra
    1 SIMPLE Seckills ALL idx_uid 0 0 0 57796 null
    1 SIMPLE seckillrecords eq_ref PRIMARY PRIMARY 8 post.uid 1 Using where
  2. ref: 使用允许重复的索引进行查询
    示例:

    SELECT * FROM seckillrecords WHERE SeckillNum=1;

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| ---- | ----------- | ----- | ---- | ------------- | ---------- | ------- | ----- | ---- | --------------------- |
| 1 | SIMPLE | user | ref | SeckillNum | SeckillNum | 4 | const | 1 | Using index condition |

  1. range: 使用索引进行范围查询:
    示例:

    SELECT * FROM seckillrecords WHERE age > 2;
    id select_type table type possible_keys key key_len ref rows Extra
    1 SIMPLE user range idx_age idx_age 259 const 1 null
  2. index: 在索引上进行顺序扫描。常见于在多列索引中未使用最左列进行查询。
    示例:

    SELECT * FROM seckillrecords WHERE OrderSn  = 'sminit';
    id select_type table type possible_keys key key_len ref rows Extra
    1 SIMPLE user index idx_full_name_osn idx_full_name_osn 259 const 1 Using where
  3. all: 扫描全表,最坏的情况

6.执行计划-possible_keys

实际使用的索引。
如果为NULL,则没有使用索引,查询中若使用了覆盖索引,则该索引和查询的select字段重叠

7.执行计划-key_len

索引使用的字节数,相当于长度

char和varchar跟字符编码也有密切的联系,
​ latin1占用1个字节,gbk占用2个字节,utf8占用3个字节。(不同字符编码占用的存储空间不同)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8.执行计划-ref

显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值

9.执行计划-rows

根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数

10.执行计划-Extra

extra 列显示了查询过程中需要执行的其它操作,有些情况应尽力避免。

  • using filesort: 查询时执行了排序操作而无法使用索引排序。虽然名称为'file'但操作可能是在内存中执行的,取决是否有足够的内存进行排序。
    应尽量避免这种filesort出现。
  • using temporary: 使用临时表存储中间结果,常见于ORDER BY和GROUP BY语句中。临时表可能在内存中也可能在硬盘中,应尽量避免这种操作出现。
  • using index: 索引中包含查询的所有列不需要查询数据表(回表)。可以加快查询速度。
  • using where: 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给客户端
  • using index condition: 索引条件推送(MySQL 5.6 新特性),服务器层将不能直接使用索引的查询条件推送给存储引擎,从而避免在服务器层进行过滤。
  • distinct: 优化distinct操作,查询到匹配的数据后停止继续搜索
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
22天前
|
缓存 关系型数据库 MySQL
MySQL执行计划选择策略:揭秘查询优化的艺术
【10月更文挑战第15天】 在数据库性能优化中,选择最优的执行计划是提升查询效率的关键。MySQL作为一个强大的关系型数据库管理系统,提供了复杂的查询优化器来生成执行计划。本文将深入探讨如何选择合适的执行计划,以及为什么某些计划更优。
46 2
|
22天前
|
缓存 关系型数据库 MySQL
MySQL执行计划深度解析:如何做出最优选择
【10月更文挑战第23天】 在数据库查询性能优化中,执行计划的选择至关重要。MySQL通过查询优化器来生成执行计划,但有时不同的执行计划会导致性能差异。理解如何选择合适的执行计划,以及为什么某些计划更优,对于数据库管理员和开发者来说是一项必备技能。
31 2
|
22天前
|
SQL 关系型数据库 MySQL
美团面试:Mysql如何选择最优 执行计划,为什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴面试美团时遇到了关于MySQL执行计划的面试题:“MySQL如何选择最优执行计划,为什么?”由于缺乏系统化的准备,小伙伴未能给出满意的答案,面试失败。为此,尼恩为大家系统化地梳理了MySQL执行计划的相关知识,帮助大家提升技术水平,展示“技术肌肉”,让面试官“爱到不能自已”。相关内容已收录进《尼恩Java面试宝典PDF》V175版本,供大家参考学习。
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1636 14
|
28天前
|
存储 关系型数据库 MySQL
基于案例分析 MySQL 权限认证中的具体优先原则
【10月更文挑战第26天】本文通过具体案例分析了MySQL权限认证中的优先原则,包括全局权限、数据库级别权限和表级别权限的设置与优先级。全局权限优先于数据库级别权限,后者又优先于表级别权限。在权限冲突时,更严格的权限将被优先执行,确保数据库的安全性与资源合理分配。
|
1月前
|
SQL 关系型数据库 MySQL
MySQL 更新1000万条数据和DDL执行时间分析
MySQL 更新1000万条数据和DDL执行时间分析
109 4
|
1月前
|
SQL 自然语言处理 关系型数据库
Vanna使用ollama分析本地MySQL数据库
这篇文章详细介绍了如何使用Vanna结合Ollama框架来分析本地MySQL数据库,实现自然语言查询功能,包括环境搭建和配置流程。
200 0
|
2月前
|
Oracle NoSQL 关系型数据库
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
408 2
|
2月前
|
存储 关系型数据库 MySQL
分析MySQL主从复制中AUTO_INCREMENT值不一致的问题
通过对 `AUTO_INCREMENT`不一致问题的深入分析和合理应对措施的实施,可以有效地维护MySQL主从复制环境中数据的一致性和完整性,确保数据库系统的稳定性和可靠性。
103 6
|
1月前
|
SQL 关系型数据库 MySQL
MySQL EXPLAIN该如何分析?
本文将详细介绍MySQL中`EXPLAIN`关键字的工作原理及结果字段解析,帮助优化查询性能。`EXPLAIN`可显示查询SQL的执行计划,其结果包括`id`、`select_type`、`table`等字段。通过具体示例和优化建议,帮助你理解和应用`EXPLAIN`,提升数据库查询效率。
82 0