MySQL执行计划EXPLAIN

结绳记事,总结,思考,方有成长~

MySQL执行计划调用方式

EXPLAIN SELECT ……

执行计划包含的信息及解读
如下是一个显示执行计划的例子:

EXPLAIN SELECT * FROM order_info a, sku_info b
WHERE a.order_id = b.order_id 
AND a.order_id = 202003090015

执行计划该EXPLAIN命令的输出信息可以告诉我们MySQL访问了哪些表,以及他们是如何访问到数据的。里面有很重要的索引使用信息,可以根据此判断我们的索引是否需要优化。
下面将详细展示 EXPLAIN 输出的各项内容

  • id:包含一组数字,表示查询中执行 SELECT 子句或操作表的顺序。如果id相同,则执行顺序由上至下。如果是子查询,id的序号会递增,值越大越先被执行,例如:
EXPLAIN SELECT * FROM examination_order_info a
WHERE a.order_id = (SELECT id 
										 FROM examination_order_sku_info b
										 WHERE b.order_id = '202003090015')

id执行顺序

  • select_type:表示查询中每一个子句的类型,共有以下六种:

    • SIMPLE: 查询中不包含子查询或UNION
    • PRIMARY:查询中包含任何复杂的子部分,最外层查询则被标记为PRIMARY
    • SUBQUERY:在 SELECT 或者 WHERE 列表中若包含了子查询,则该子查询被标记为SUBQUERY
    • DERIVED(衍生):在 FROM 列表中包含的子查询被标记为DERIVED。例如:
      SELECT col1 FROM (SELECT col1, col2 FROM t1 WHERE id = 123) t2
    • UNION:若第二个 SELECT 出现在UNION之后,则被标记为UNION;
    • UNION RESULT:从 UNION 表中获取结果的 SELECT 将被标记为 UNION RESULT
  • type:表示MySQL在表中找到记录的方式,又称“访问类型”,是衡量索引使用情况的重要指标。常见的类型如下:ALL、index、range、ref、eq_ref、const/system、NULL,从左到右,性能由差到好。

    • ALL:Full Table Scan,全表扫描,MySQL将遍历整个表以找到匹配的行,性能当然最差,尤其当表数据量很大的时候,这是不能忍受的。
    • index:Full Index Scan,全索引扫描,索引物理文件全表扫描,与ALL的区别为index类型只遍历索引树,小巫见大巫。当然,性能也好不到哪里去。
    • range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于between、<、>等的查询。一般来说,索引范围扫描要检索的记录更少,因为成本更低,是我们能接受的最低标准,如果达不到这个水平,赶紧优化吧~
    • ref:普通索引扫描,将返回匹配某个单独值的所有行。常见于使用非唯一索引。
    • eq_ref:唯一索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。如下:b表全表扫描,a表使用唯一索引关联查询。
EXPLAIN SELECT * FROM order_info a, sku_info b
WHERE a.order_id = b.order_id

eq_ref

  • const/system:MySQL对查询的某部分优化,并转换为一个常量时,可使用这些类型进行访问。如将主键至于 WHERE 列表中,MySQL就能将该查询转换为一个常量。system 是 const类型的特列,当查询的表中只有一行的情况下,既是 system。
EXPLAIN SELECT * FROM order_info a
WHERE a.order_id = '202003090015'

const

  • NULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,这个厉害了
EXPLAIN EXTENDED SELECT * FROM order_info a
WHERE a.order_id = (SELECT min(order_id) FROM sku_info);

SHOW WARNINGS;

type=null
warnings

  • posibble_keys:查询涉及的字段上存在索引,则该索引将被列出,但不一定会被查询使用。
  • key:显示查询中使用到的索引,如果没有,则为NULL
  • key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引长度。
  • ref:表示上述表的链接匹配条件,即哪些列或常量被用于查找索引列上的值。
  • rows找到匹配的记录所要读取的行数。在一个查询中,创建了索引后,所需要读取的行数减少。
  • Extra:包含不适合在其他列中展示但十分重要的额外信息。可能包含如下4种情况:
    • Using index:表示相应的查询使用了覆盖索引,例如:
EXPLAIN SELECT order_id FROM order_info
WHERE order_id = 202003090014

覆盖索引

  • Using where:如果查询未能使用索引,则Using where 只是提示我们MySQL将使用where子句来过滤结果集。
  • Using temporary:表示该查询需要建立临时表,常见于排序分组查询。
  • Using filesort:MySQL无法使用索引完成的排序操作成为“文件排序”。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值