mysql中explain的使用及介绍

mysql explain用于分析sql 语句的执行及数据库索引的使用。本文将致力于帮助大家充分理解explain所返回的各项参数,从而使大家快速掌握explain用法技巧。如果你在看其他教程或视频后仍觉得云里雾里。那么请通读本文。

用法

explain的用法相当简洁,直接在sql语句前加上EXPLAIN 即可,例如:

EXPLAIN
select * FROM ec_stores_info where stores_id = 9

本语句将返回:

è¿éåå¾çæè¿°

每行将得到id,select_type,table,type,possible_keys,key,key_len,ref,rows,Extra几个参数。 
其中与效率息息相关的则是type,key,ref,rows。 
下面依次解析以上所有参数:

type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
         一般来说,得保证查询至少达到range级别,最好能达到ref。

参数解析

id,select_type,table 用于定位查询,表示本行参数所对应的sql查询部分:

(1)id

SELECT识别符。这是SELECT的查询序列号。不重要,需要注意的是,不要把id当成执行顺序,这并不准确。

(2)select_type

SELECT类型,可以为以下几种:

  1. SIMPLE: 指示非子查询和union的简单查询。
select * from class

 PRIMARY: 指示在有子查询的语句中最外面的select,主查询。 

UNION: 指示在使用union语句的第二个或后面的select。 

è¿éåå¾çæè¿°

DEPENDENT UNION: 子查询union语句的第二个或后面的select。

UNION RESULT : union语句的结果集。 

è¿éåå¾çæè¿°

DERIVED:派生表的SELECT(FROM子句的子查询)。 

è¿éåå¾çæè¿°

(3)table

就是表名,本行记录对应查询所应用的表。可以通过table表名帮助定位查询。

使用explain时,有时table字段显示的并不是表名,而是 derived2 或 derived3 等等。。。 
即 derived x 代表的是id为x的查询所得的结果集。例如:

EXPLAIN 
SELECT so.storeorder_id,so.storeorder_sn,si.stores_name
from ec_stores_order so
INNER JOIN 
(SELECT stores_id,stores_name from ec_stores_info where stores_creatorid=2) si 
on so.store_id=si.stores_id

explain后所得: 
è¿éåå¾çæè¿°

由以上内容可知,id为2的记录对应inner join后的子查询1,第一条记录所对应的table参数值derived2即为子查询1的结果集。

案例

为帮助大家理解,请看2个案例:

(1)

EXPLAIN
SELECT o.storeorder_id,o.storeorder_sn,i.stores_name 
from ec_stores_order o 
INNER JOIN ec_stores_info i 
on o.store_id = i.stores_id

本例中没有子查询,所以explain后将返回两条简单查询记录 

è¿éåå¾çæè¿°

两条select_type均为SIMPLE,第一条table 为o 即 stores_order表的代号,所以判定第一条的参数为join前半段在stores_order表中检索数据的过程,第二条则是通过store_id在stores_info表中获取stores_name的过程。

(2)

将上例中sql语句改写成如下等效sql:

EXPLAIN
SELECT o.storeorder_id,
o.storeorder_sn,(SELECT stores_name from ec_stores_info where stores_id=o.store_id) as stores_name 
from ec_stores_order o

本条sql与上条sql效果相同,但是加入了子查询,故而返回参数与上个案例完全不同:

è¿éåå¾çæè¿°

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值