Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL(九)|如何查看执行计划(Explain)

MySQL(九)|如何查看执行计划(Explain)

作者头像
黄小怪
发布于 2019-07-27 11:56:07
发布于 2019-07-27 11:56:07
2.4K0
举报
文章被收录于专栏:小怪聊职场小怪聊职场

我们经常会使用Explain去查看执行计划,这个众所周知。但我在面试时问面试者,你用Explain主要是看什么?对方的回答大多是“查看是否有使用到索引”,很显然我对这个回答不太满意。 今天我们就来说一说Explain中的“Type”和“Extra”。

一、Explain中的“Type”

Explain中的“Type”

MySQL的官网解释为:连接类型(the join type)。它描述了找到所需数据使用的扫描方式。

最为常见的扫描方式有:

  • system:系统表,少量数据,往往不需要进行磁盘IO;
  • const:常量连接;
  • eq_ref:主键索引(primary key)或者非空唯一索引(unique not null)等值扫描;
  • ref:非主键非唯一索引等值扫描;
  • range:范围扫描;
  • index:索引树扫描;
  • ALL:全表扫描(full table scan);

上面各类扫描方式由快到慢: system > const > eq_ref > ref > range > index > ALL

1.1 system

扫码类型为system,说明数据已经加载到内存里,不需要进行磁盘IO。 这类扫描是速度最快的。 但是我没有遇到过,遇到了我再来补充!

1.2 const

explain select id from account_user_base where id =1; const扫描的条件为: (1)命中主键(primary key)或者唯一(unique)索引; (2)被连接的部分是一个常量(const)值;

1.3 eq_ref

eq_ref扫描的条件为:对于前表的每一行(row),后表只有一行被扫描。 我也没有遇到!

1.4 ref

explain select * from account_user_base t1,account_user_security t2 where t1.id = t2.user_id; 对于前表的每一行(row),后表可能有多于一行的数据被扫描。

1.5 range

explain select * from account_user_base where id > 4; range类型,它是索引上的范围查询,它会在索引上扫码特定范围内的值。

1.6 index

explain select id from account_user_base; index类型,需要扫描索引上的全部数据。

1.7 ALL

explain select * from account_user_base; 全表扫描。

1.8总结

  • system最快:不进行磁盘IO
  • const:PK或者unique上的等值查询
  • eq_ref:PK或者unique上的join查询,等值匹配,对于前表的每一行(row),后表只有一行命中
  • ref:非唯一索引,等值匹配,可能有多行命中
  • range:索引上的范围扫描,例如:between/in/>
  • index:索引上的全集扫描
  • ALL最慢:全表扫描(full table scan)

二、Explain中的“Extra”

Explain中的“Extra”

从上图我们得知,Extra的值有NULL、Using index、Using where、Using index condition、Using filesort、Using temporary

2.1 Using where

explain select * from account_user_base where id > 4; Extra为Using where说明,SQL使用了where条件过滤数据。

2.2 Using index

explain select id from account_user_base; Extra为Using index说明,SQL所需要返回的所有列数据均在一棵索引树上,而无需访问实际的行记录。

2.3 Using index condition

explain select * from account_user_security t1, account_user_base t2 where t1.user_id = t2.id; Extra为Using index condition说明,确实命中了索引,但不是所有的列数据都在索引树上,还需要访问实际的行记录。

2.4 Using filesort

explain select id from account_user_base order by nick_name; Extra为Using filesort说明,得到所需结果集,需要对所有记录进行文件排序。 典型的,在一个没有建立索引的列上进行了order by,就会触发filesort,常见的优化方案是,在order by的列上添加索引,避免每次查询都全量排序。

2.5 Using temporary

explain select nick_name, COUNT(*) from account_user_base GROUP BY nick_name order by nick_name; Extra为Using temporary说明,需要建立临时表(temporary table)来暂存中间结果。 这类SQL语句性能较低,往往也需要进行优化。 典型的,group by和order by同时存在,且作用于不同的字段时,就会建立临时表,以便计算出最终的结果集。

注:本文大部分内容来自于微信公众号:架构师之路的两篇文章《同一个SQL语句,为啥性能差异咋就这么大呢?(1分钟系列)》、《如何利用工具,迅猛定位低效SQL? | 1分钟系列》 测试的MySQL版本为InnoDB 5.7.22

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.07.26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
什么是MySQL的执行计划(Explain关键字)?
本文作者王良辰,京东中台架构师,擅长分布式系统及高可用、高并发系统架构与设计。曾经为企业开发过多个通用脚手架,推崇以技术手段提升开发效率、约束开发行为。
小灰
2020/10/27
2.9K0
什么是MySQL的执行计划(Explain关键字)?
MYSQL explain执行计划解读
Explain查看查询计划主要包含如下信息列:查询id、查询类型、查询表、扫描访问类型、查询可能选用的索引、查询实际使用索引、mysql决定使用索引长度、ref 显示哪个字段或常数与key一起被使用、估算扫描行数、额外重要信息。--重点关注加粗部分。
码农编程进阶笔记
2021/07/20
1.1K0
MYSQL explain执行计划解读
技术分享 | EXPLAIN 执行计划详解(1)
爱可生 DBA 团队成员,擅长故障分析、性能优化,个人博客:https://www.jianshu.com/u/a95ec11f67a8,欢迎讨论。
爱可生开源社区
2021/02/26
2.5K0
技术分享 | EXPLAIN 执行计划详解(1)
不会看 Explain执行计划,劝你简历别写熟悉 SQL优化
昨天中午在食堂,和部门的技术大牛们坐在一桌吃饭,作为一个卑微技术渣仔默默的吃着饭,听大佬们高谈阔论,研究各种高端技术,我TM也想说话可实在插不上嘴。
程序员小富
2020/05/20
8630
不会看 Explain执行计划,劝你简历别写熟悉 SQL优化
explain各字段的含义
5.7以前,该项是explain partitions显示的选项; 5.7以后成为了默认选项.
fliter
2023/09/23
3680
explain各字段的含义
mysql explain ref列_MySQL EXPLAIN详解
MySQL EXPLAIN详解:http://www.jianshu.com/p/ea3fc71fdc45
全栈程序员站长
2022/11/02
4.1K0
带你看懂MySQL执行计划
前面文章,我们学习了 MySQL 慢日志相关内容,当我们筛选得到具体的慢 SQL 后,就要想办法去优化啦。优化 SQL 的第一步应该是读懂 SQL 的执行计划。本篇文章,我们一起来学习下 MySQL explain 执行计划相关知识。
MySQL技术
2021/07/05
1.7K0
MySQL Explain查看执行计划
expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra,下面对这些字段出现的可能进行解释:
星哥玩云
2022/08/16
2K0
MySQL Explain查看执行计划
MySQL EXPLAIN详解
MySQL数据库是许多Web应用程序的底层支持,而查询性能的优化是确保系统高效运行的关键。在MySQL中,EXPLAIN是一项强大的工具,可帮助开发者深入了解查询语句的执行计划,从而更好地优化查询性能。本文将详细解析MySQL的EXPLAIN关键字,以揭开查询执行计划的面纱。
修己xj
2023/12/06
4900
MySQL EXPLAIN详解
用 Explain 命令分析 MySQL 的 SQL 执行
在上一篇文章《MySQL常见加锁场景分析》中,我们聊到行锁是加在索引上的,但是复杂的 SQL 往往包含多个条件,涉及多个索引,找出 SQL 执行时使用了哪些索引对分析加锁场景至关重要。
程序员历小冰
2020/06/15
1.5K0
【MySQL系列】- MySQL执行计划一览
根据表、列、索引和WHERE子句中的条件的详细信息,MySQL优化器考虑了许多技术来有效地执行SQL查询中涉及的查找。对一个巨大表的查询可以在不读取所有行的情况下执行;涉及多个表的联接可以在不比较每个行组合的情况下执行。「优化器选择执行最有效查询的操作集称为“查询执行计划(query execution plan)”,也称为EXPLAIN计划。」
索码理
2022/12/28
8080
【MySQL系列】- MySQL执行计划一览
MySQL 索引管理与执行计划
1.1 索引的介绍   索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信
惨绿少年
2017/12/27
2K0
MySQL 索引管理与执行计划
MySQL优化之Explain命令解读
  explain为MySQL提供语句的执行计划信息。可以应用在select、delete、insert、update和place语句上。explain的执行计划,只是作为语句执行过程的一个参考,实际执行的过程不一定和计划完全一致,但是执行计划中透露出的讯息却可以帮助选择更好的索引和写出更优化的查询语句。
星哥玩云
2022/08/17
8900
查看Mysql执行计划
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
chenchenchen
2019/10/22
3.4K0
查看Mysql执行计划
mysql执行计划看是否最优
介绍   本篇主要通过汇总网上的大牛的知识,简单介绍一下如何使用mysql的执行计划,并根据执行计划判断如何优化和是否索引最优。   执行计划可显示估计查询语句执行计划,从中可以分析查询的执行情况是否最优,有助于对不使用索引的语句进行优化。EXPLAIN对每个查询返回一行信息,列出了有序的表格,MySQL处理语句的时候读取他们。MySQL解决所有的连接使用嵌套连接方法。这意味读取第一张一行,然后匹配第二张表的所有行,第三张表甚至更多表。当所有的表在处理时,MySQL会输出已经查询出来的列,并且回溯到表继续
用户1217611
2018/03/19
2.1K0
MySQL执行计划
它是一个关键字。我们知道我们写的SQL,执行之前要经过优化器的优化,所以我们写的SQL经过SQL优化器之后到底是怎么样的?这就可以通过explain关键字来查看。
贪挽懒月
2021/04/23
1.1K0
性能优化-通过explain查询分析SQL的执行计划
SQL的执行计划侧面反映出了SQL的执行效率,具体执行方式如下所示:在执行的SQL前面加上explain关键词即可;
cwl_java
2020/02/13
1.5K0
详解Mysql执行计划explain
MySql提供了EXPLAIN语法用来进行查询分析,在SQL语句前加一个”EXPLAIN”即可。
chenchenchen
2020/05/27
1K0
mysql explain用法和结果的含义
table 输出的行所引用的表 type 联接类型。下面给出各种联接类型,按照从最佳类型到最坏类型进行排序:
yaphetsfang
2020/07/30
2.3K0
用 Explain 命令分析 MySQL 的 SQL 执行
在上一篇文章《MySQL常见加锁场景分析》中,我们聊到行锁是加在索引上的,但是复杂的 SQL 往往包含多个条件,涉及多个索引,找出 SQL 执行时使用了哪些索引对分析加锁场景至关重要。
程序员历小冰
2020/06/16
1.9K0
相关推荐
什么是MySQL的执行计划(Explain关键字)?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档