文章目录
一、阅读前
其实录制了一个视频专门讲解这篇文章,视频中讲的比下文还全哦
视频链接:
https://mp.weixin.qq.com/s/wGcODm6gfy6JOvkcKp-8MA
https://mp.weixin.qq.com/s/wGcODm6gfy6JOvkcKp-8MA
Oow!
想白嫖explain实战部分用到的建库SQL、存储过程等脚本可以通过上面的视频链接关注,后台回复:explain即可领取哦~
二、explain 实战
2.1、初识执行计划:
获取sql执行计划的语法:explain yoursql
explain select * from t1;
字段名 | 作用 |
---|---|
id | sql中的每一个select都有一个未对应的id,对子查询来说,有多个select,就有多个id。 |
select_type | sql执行计划对应的查询类型。如: 1.针对单表查询或者是多表连接查询的select type是simple。 2.union语句针对前半部分sql的select_type为primary,针对后半部分sql的select_type为union,做去重时的select_type是union result。3.sql中出现子查询时,外层的select_type为primary,内层的select_type一般为subquery |
table | 你的sql要查询哪个表 |
partitions | 分区表 |
type | 针对该表查询时的查询方式。如: 1.聚簇索引的const 2.二级索引的查询ref(ref、eq_ref、ref_or_null)、range 3.对二级索引的全表扫描index 4.对聚簇索引的全表扫描的all |
possible_keys | 有哪些索引可以选择 |
key | 实际选择的索引 |
key_len | 索引的长度 |
ref | 和上面选中key进行比较时,是等值匹配(const)还是其他的字段(库名.表名.列名) |
rows | 估算的可能会读取的数据条数 |
filtered | 过滤比例,真实数据*过滤比例为预计将读取出来的数据 |
extra | 额外的说明数据,如: 1.sql中有where条件时,Extra为:Using Where 2.sql中使用二级索引时,Extra为:Using Index 3.sql中有join语句多表关联时:Extra为:Using join buffer(Block Nested Loop) 4.sql操作产生临时表时,Extra为:Using temporary 5.sql需要根据某个字段排序,且内存不够时(不管是不是索引):Extra为:Using filesort |
2.2、分析联表SQL的执行计划
SQL如下:
mysql> explain select * from t1 join t2;
SQL执行时,会先将驱动表t1中的数据以全表扫描的方式检索出来放在内存中,一共检索4行。然后在将t2表中的数据检索出来,和t1中的数据join在一起作为返回值。由于我们没有加任何where条件,这里还会存在一个笛卡尔积,也就是说结果中会有16条数据
执行计划解析:
id:每一个select 关键字对应一个id,这条SQL中只有一个select,所以这两行执行计划的id都是1
select_type:均是simple 简单的查询方式。
table:查询了哪张表
Partitions:分区
type:ALL表示全表扫描
possible_keys:可能使用到的索引,null表示,没有任何索引 key:null表示实际上也没有使用到索引
key_len:最长的索引的长度
ref:当你使用到索引时,索引列是等值匹配还是其他的连接方式,由于我们都没有索引,所以直接为null
rows:估算的扫描行数
filterd:过滤的比例,实际数量*过滤比例 ≈ 本次查询返回的行数
Extra:其他的信息
2.3、分析子查询SQL的执行计划
SQL如下:
<