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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
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问题排查就会轻松很多

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
26天前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
65 11
|
2月前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
2月前
|
SQL 缓存 数据库
SQL慢查询优化策略
在数据库管理和应用开发中,SQL查询的性能优化至关重要。慢查询优化不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将详细介绍针对SQL慢查询的优化策略。
|
2月前
|
SQL 存储 BI
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
|
2月前
|
SQL 数据库
gbase 8a 数据库 SQL优化案例-关联顺序优化
gbase 8a 数据库 SQL优化案例-关联顺序优化
|
2月前
|
SQL 数据库 UED
SQL性能提升秘籍:5步优化法与10个实战案例
在数据库管理和应用开发中,SQL查询的性能优化至关重要。高效的SQL查询不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将分享SQL优化的五大步骤和十个实战案例,帮助构建高效、稳定的数据库应用。
114 3
|
2月前
|
SQL 缓存 监控
SQL性能提升指南:五大优化策略与十个实战案例
在数据库性能优化的世界里,SQL优化是提升查询效率的关键。一个高效的SQL查询可以显著减少数据库的负载,提高应用响应速度,甚至影响整个系统的稳定性和扩展性。本文将介绍SQL优化的五大步骤,并结合十个实战案例,为你提供一份详尽的性能提升指南。
64 0
|
4月前
|
关系型数据库 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)")
|
6月前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
154 13
|
6月前
|
SQL
解锁 SQL Server 2022的时间序列数据功能
【7月更文挑战第14天】要解锁SQL Server 2022的时间序列数据功能,可使用`generate_series`函数生成整数序列,例如:`SELECT value FROM generate_series(1, 10)。此外,`date_bucket`函数能按指定间隔(如周)对日期时间值分组,这些工具结合窗口函数和其他时间日期函数,能高效处理和分析时间序列数据。更多信息请参考官方文档和技术资料。