explain是什么?explain优缺点及如何使用explain优化SQL

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: explain是什么?explain优缺点及如何使用explain优化SQL


Explain

定义

查看当前查询语句索引是否生效,是否有使用到索引

作用

表的读取顺序

查询类型

哪些索引可以使用

哪些索引实际被使用到

简单介绍一下每个字段对应代表什么意思

Explain 每个字段定义

Id

表示查询中执行selet子句或操作表的顺序

select_type

查询的类型,主要是用于区别普通查询、联合查询、子查询等复杂查询

具体有一下几种类型

  1. SIMPLE 简单的select 查询,查询总不包含子查询或UNION
  2. PRIMARY 查询中包含任何复杂的子部分,最外层查询则被标记为(主查询)
  3. SUBQUERY 在select 或where列表中包含了子查询
  4. DERIVED 在from列表汇总包含的子查询被标记为DERIVED(衍生)
  5. MySQL会递归执行这些子查询,把结果放在临时表(衍生的临时表)
  6. UNION 若第二个select出现在UNION之后,则被标记为UNION
  7. 若UNION包含在form子句的子查询中,外层select将被标记为DERIVED
  8. UNIONRESULT 从UNION表获取结果的SELECT

table

显示这行数据是关于当前这张表的

type

显示访问类型

结果值从最好到最坏依次是:

system>const>eq_ref>ref>reange>index>ALL

一般来说,保证查询至少达到range级别,最好能达到ref

possible_keys

显示可能应用到这张表中的索引,一个或多个显示可能应用到这张表中的索引,一个或多个;

查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用(理论上应该用到的索引数量);

key

实际使用的索引。如果为NULL,则没有使用索引;

查询中若使用了覆盖索引,则该索引仅出现在key列表中(实际用到的索引数量);

key_len

表示索引中使用的字节数,值越大查询数来的结果越精确

ref

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

rows

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

Extra

Mysql支持两种排序方式

文件排序(using filesort)或者扫描有序索引排序(using index)

应用场景

场景一

explain select * from student

根据上面的各个字段定义,可以看到这条SQL执行后,select_type显示为是一条简单SQL,table显示为查询的是student表

type 扫描类型是全局扫描,possible_keys 应该用到索引,显示为null,key实际用到索引显示为null,从这两个字段可以看

出,要么索引失效了,要么没有索引,ref也显示到了没有用到索引,Extra 排序类型也没有

查了一下这个表是有索引的,那为什么没有用上呢?

原因是:我在我的博文中(链接: MySQL 索引)提到过索引失效的几种原因,其中就有一种检索数据时使用select *,会导致索引失效,下面我们来验证一下不用select * 是否可以

下面我们来验证一下不用select * ,用索引列是否可以

看到了吧,type是index (system>const>eq_ref>ref>reange>index>ALL),虽然说没有达到ref或reange,但是最起码不是全表扫描ALL,key实际用到索引了,排序类型是 Using index 索引排序,这就是我们一个基本的SQL调优排查,为其排查索引是否失效

场景二

explain select StudentName from student where StudentNo > 'S001' and StudentNo < 'S005' order by StudentNo,StudentName

虽然说查询结果中显示使用了索引,但是在Extra排序中是Using filesort(文件排序),这样对于我们检索来说,也会出现性能损耗的情况,我在我的博文中(链接: MySQL 索引)提到过索引失效的几种原因,其中就有一种 检索数据时使用范围条件进行检索可能会导致索引失效

场景三

explain select a.StudentNo,a.StudentName,b.name from student a left join class b on a.Id = b.student_Id

这种情况我在我的博文中(链接: MySQL 索引)提到过

当在连接多表查询时,如何正确的使用索引

左连接查询将索引建到右边;(LEFT JOIN 条件用于确定如何从右表搜索行,左边一定都有)

右连接查询将索引建到左边;

在这里就向别名为b表中添加索引

--向class表中name字段添加索引
create index name_index on class(name)

这时在看索引就用上了

以上就是Explain的三种使用情况,当然这些都是比较简单的索引问题排查,复杂的也与上面差不多,只要是掌握Explain每个字段的定义,SQL调优以及Explain问题排查就会轻松很多

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
2月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
200 6
|
10月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
7月前
|
SQL 存储 自然语言处理
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
|
9月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
10月前
|
SQL 关系型数据库 MySQL
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
456 9
|
11月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
11月前
|
SQL 分布式计算 Java
Spark SQL向量化执行引擎框架Gluten-Velox在AArch64使能和优化
本文摘自 Arm China的工程师顾煜祺关于“在 Arm 平台上使用 Native 算子库加速 Spark”的分享,主要内容包括以下四个部分: 1.技术背景 2.算子库构成 3.算子操作优化 4.未来工作
1436 0
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
541 13
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。
365 9