explain使用方法及结果分析

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: explain使用方法及结果分析

1. 什么是explain命令

explain命令是查看MySQL查询优化器如何执行查询的主要方法,可以很好地分析SQL语句的执行情况。


每当遇到执行慢的SQL,就可以使用explain命令来检查SQL的执行情况,并根据运行结果进行分析,采用相应的方法对SQL语句进行优化。


通过explain我们可以获得以下信息:


  • 表的读取顺序
  • 数据读取操作的操作类型
  • 哪些索引可以使用
  • 哪些索引被实际使用
  • 表之间的引用
  • 每张表有多少行被优化器查询


2. 如何使用explain命令

只需在SQL语句前使用explain关键字即可;

如:

EXPLAIN SELECT * FROM student_info WHERE student_id = 'A01234567';

3. 分析explain命令执行结果

在执行了explain命令后,会得到一个含有很多列的输出结果,下面一起来看一下各个列所代表的含义吧。


3.1. id

  1. 如果多行id相同,执行顺序由上至下 ;
  2. 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行;
  3. 如果多行id有的相同有的不同,那么id相同的可以认为是一组,同一组中从上往下执行;id大的组优先执行;


3.2. select_type

select_type所显示的是SELECT的类型:


  1. SIMPLE:简单的SELECT,没有使用UNION或者子查询;
  2. PRIMARY:最外层SELECT;
  3. UNION:第二层,在SELECT之后使用了UNION;
  4. DEPENDENT UNION:UNION语句中的第二个SELECT,依赖于外部子查询;
  5. UNION RESULT:UNION的结果;
  6. SUBQUERY:子查询中的第一个SELECT;
  7. DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询;
  8. DERIVED:导出表的SELECT(FROM子句的子查询);

3.3. table

显示对应行正在访问哪个表,通常是表名或者该表的别名(如果SQL定义了别名);

3.4. type

type所显示的是查询使用了哪种类型,所有type按照从好到坏的顺序排列如下:

system > const > eq_ref > ref > range > index > all


  1. system:表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计;
  2. const:表示通过索引一次就找到了,const用于primary key或者unique索引。因为只匹配一行数据,所以很快。如将主键置于where语句中,MySQL就能将该查询转换为一个常量;
  3. eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描;
  4. ref:非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体;
  5. range:只检索给定范围的行,使用一个索引来选择行,key列显示使用了哪个索引,一般就是在你的where语句中出现between, <, >, in等的查询,这种范围扫描索引比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点,不用扫描全部索引;
  6. index:全表扫描,index与all区别为index类型只遍历索引树。这通常比all快,因为索引文件通常比数据文件小。(也就是说虽然all和index都是读全表,但index是从索引中读取的,而all是从硬盘读取的) ;
  7. all:全表扫描,将遍历全表以找到匹配的行 ;


3.5. possible_keys

这一列显示了查询可以使用哪些索引,这是基于查询访问的列和使用的比较操作符来判断的。

查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用


3.6. key

显示MySQL决定采用哪个索引来优化对该表的访问。如果为NULL,则没有使用索引。(可能原因包括没有建立索引或索引失效)


如果该索引没有出现在possible_keys列中,那么MySQL选用它是出于另外的原因如可能选择了一个覆盖索引,哪怕没有where子句。


换言之,possible_keys揭示了哪一个索引有助于高效行查找,而key显示的是优化采用的哪一个索引可以最小化查询成本。


3.7. key_len

显示了MySQL在索引里使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好。


3.8. ref

显示哪个字段或常数与key一起被使用。

3.9. rows

表示MySQL预估的为了找到所需的行而要读取的行数。根据表的统计信息和索引的选用情况,这个估算可能很不精确。通过把所有rows列值相乘,可以粗略的估算出整个查询会检查的行数。越小越好。

3.10. filtered

这一列是MySQL 5.1里新加的,它显示的是针对表里符合某个条件(where子句或联结条件)的记录数所做的一个悲观估算的百分比。

3.11. Extra

这一列包含的是不适合在其他列显示的额外信息。常见的最重要的值有:


  1. Using index表示MySQL将使用覆盖索引,以避免回表查询。不要把覆盖索引和index访问类型混淆了;
  2. Using where表示MySQL服务器将在存储引擎检索行后再进行过滤;
  3. Using temporary表示MySQL在对查询结果排序时会使用一个临时表;
  4. Using filesort表示MySQL会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。MySQL有两种文件排序算法,两种都可以在内存或磁盘上完成。但explain不会告诉你MySQL使用的是哪种,也不会告诉你排序是在内存还是磁盘上完成;
  5. Range checked for each record(index map:N)表示没有好用的索引,新的索引将在联接的每一行上重新估算。N是显示在possible_keys列中索引的位图,并且是冗余的;
  6. Using union表示MySQL运用了索引合并策略,索引合并策略有时是一种优化的结果,但实际上更多时候说明了表上的索引建的很糟糕。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
NoSQL Redis
Kubernetes----部署单节点Redis
Kubernetes----部署单节点Redis
5427 1
|
Docker 容器
docker出现问题:启动nexus时报错mkdir: cannot create directory ‘../sonatype-work/nexus3‘: Permission denied解决方案
docker出现问题:启动nexus时报错mkdir: cannot create directory ‘../sonatype-work/nexus3‘: Permission denied解决方案
1854 0
docker出现问题:启动nexus时报错mkdir: cannot create directory ‘../sonatype-work/nexus3‘: Permission denied解决方案
|
12月前
|
存储 人工智能 编解码
多模态实时交互大模型浦语·灵笔 2.5 OmniLive开源:能看、能听、会记、会说!
2024年12月12日,多模态实时交互大模型书生·浦语灵笔2.5-OL(InternLM-XComposer2.5-OmniLive)开源,该模型可以通过视觉和听觉实时观察和理解外部世界,自动形成对观察到内容的长期记忆,并可通过语音与人类用户进行对话交谈,提供更自然的大模型交互体验。
729 4
多模态实时交互大模型浦语·灵笔 2.5 OmniLive开源:能看、能听、会记、会说!
|
人工智能 监控 安全
数字化施工:解决传统施工难题,提高施工效率和质量的行业革命
建筑行业是我国国民经济的重要组成部分,也是支柱性产业之一。然而,建筑业同时也是一个安全事故多发的高风险行业。如何加强施工现场的安全管理,降低事故发生的频率,避免各种违规操作和不文明施工,提高建筑工程的质量,是各级政府部门、行业人士和广大学者亟待解决的重要课题。
数字化施工:解决传统施工难题,提高施工效率和质量的行业革命
|
数据采集 存储 监控
实现自动化数据抓取:使用Node.js操控鼠标点击与位置坐标
本文介绍了如何使用Node.js和Puppeteer实现自动化数据抓取,特别是针对新闻网站“澎湃新闻”。通过设置代理IP、User-Agent和Cookie,提高爬虫的效率和隐蔽性,避免被网站封锁。代码示例展示了如何模拟鼠标点击、键盘输入等操作,抓取并整理新闻数据,适用于需要规避IP限制和突破频率限制的场景。
543 10
|
编解码 搜索推荐
如何搭建一个手机网站?
随着移动端广泛使用,网站展示已经不限于PC端,更重要是移动端(手机端)的展示。我们做公司宣传,有需要拥有一个适配手机屏幕的网站变得至关重要,那么制作一个手机网站有什么步骤呢?
537 1
|
存储 前端开发 API
DDD领域驱动设计实战-分层架构
DDD分层架构通过明确各层职责及交互规则,有效降低了层间依赖。其基本原则是每层仅与下方层耦合,分为严格和松散两种形式。架构演进包括传统四层架构与改良版四层架构,后者采用依赖反转设计原则优化基础设施层位置。各层职责分明:用户接口层处理显示与请求;应用层负责服务编排与组合;领域层实现业务逻辑;基础层提供技术基础服务。通过合理设计聚合与依赖关系,DDD支持微服务架构灵活演进,提升系统适应性和可维护性。
1217 10
|
算法 C++
C++中的友元类(Friend Classes)技术详解
C++中的友元类(Friend Classes)技术详解
722 0
|
前端开发
CSS动画(动态导航栏)
CSS动画(动态导航栏)
|
JavaScript Java API
云效问题之流水线使用npm制品仓库构建拉取依赖特别慢如何解决
云效仓库是阿里云提供的代码托管和版本控制服务,支持Git等多种版本管理工具;本合集聚焦于云效仓库的使用技巧、团队协作流程以及常见问题解答,旨在帮助开发者更高效地进行代码管理和协作开发。
548 0