MySQL执行计划-Explain初探

本文介绍了MySQL的Explain工具,用于查看SQL查询的执行计划,帮助分析性能瓶颈。通过Explain,可以了解查询顺序、数据读取操作类型、索引使用情况及表间引用等。了解Explain的id、select_type和type等字段含义,能有效优化查询效率。
摘要由CSDN通过智能技术生成

一、Explain是什么

简而言之,explain是用来查看执行计划的,使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。可以分析出查询语句或者是表结构的性能瓶颈。具体说明可以参考MySQL官网
使用EXPLAIN优化查询

二、Explain能干嘛

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

三、Explain怎么用

  1. EXPLAIN 的使用很简单:explain+sql语句即可。
EXPLAIN select * from sys_user LEFT JOIN sys_role on sys_user.role_id = sys_role.role_id ;
  1. EXPLAIN的关键是看懂执行计划所包含的信息。
    如下图所示为执行后的结果,首先要知道表头各个字段的含义。
    执行计划
ColumnJSON NameMeaning
idselect_idThe SELECT identifier
select_typeNoneThe Select Type
tabletable_namethe table for the output row
partitionspartitionsthe matching partitions
typeaccess_typethe join type
possible_keyspossible_keysthe possible indexes to choose
keykeythe index actually chosen
key_lenkey_lengththe length of the chosen key
refrefthe columns compare to the index
rowsrowsEstimate of rows to be examined
filteredfilteredPercentage of rows filtered by table condition
ExtraextraAdditional information

各个字段的具体含义和使用

EXPLAIN-id
Id是什么?

该id不是主键,而是Explain分析select语句之后,得出的查询序列号,包含一组数字,用来表示该查询语句中执行select子句或者操作表的顺序。

Id的三种取值情况:
  1. Id相同:执行顺序自上而下,顺序执行
EXPLAIN select * from sys_user LEFT JOIN sys_role on sys_user.role_id = sys_role.role_id ;

该语句执行后的结果:
Id相同
这是什么意思呢?这表明在该查询中,两张表的优先级是一致的,执行顺序就是谁在前,谁先执行,由上而下执行,也就是sys_user先查,再查sys_role
2. Id不同:如果是子查询,id的值会递增,值越大,优先级越高,越先执行。

explain select sys_user.* from sys_user where role_id = (select role_id from sys_role where role_id = 1);

id不同
3. Id有的相同有的不相同:id值越大越先执行,值相同的,从上而下顺序执行。

explain select * from (select * from sys_user limit 10) as s,sys_role where s.role_id = sys_role.role_id;

id有相同有不同

EXPLAIN-select_type
select_type是什么?
序号select_type解释
1simple简单的查询,没有union或者子查询
2primary需要Union或者子查询的select语句,位于最外层的查询单元的select_type即为primary,有且仅有一个
3union在select之后使用了union,第一个查询是dervied派生表,除了第一个表外,第二个以后的表select_type都是union
4dependent unionunion语句中第二个select,依赖外部子查询
5subquery子查询中第一select
6dependent subquery子查询中的第一个subquery,依赖于外部子查询
7devied派生表select(from子句中的子查询)
EXPLAIN-table
table是什么?

显示的查询表名,如果查询使用了别名,那么这里显示的是别名,如果不涉及对数据表的操作,那么这显示为null,如果显示为尖括号括起来的就表示这个是临时表,后边的N就是执行计划中的id,表示结果来自于这个查询产生。如果是尖括号括起来的

EXPLAIN-type
type是什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值