mysql explain详解

本文详细介绍了MySQL中EXPLAIN命令的使用方法及解析技巧,包括其语法结构、查询类型分类及联接类型等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

何为explain?
mysql explain的功能 : 获取select的相关信息 (点我查看
注:explain 的别名 desc  
-----------------------------------------------------------------------------------------------------
语法结构:
    explain 你的表名 此语句 等同于 show columns from 你的表名
    explain 你的查询sql语句
注:只能用于你的查询语句,不用怀疑,我试过了insert、delete、update 均大爷的报错~
例:explain select * from score_major;
-----------------------------------------------------------------------------------------------------
用法指南:
      以下采集于myqsl官网描述:
      
粗略理解:就是查看你select语句的索引使用情况,语句扫描的行数,关联查询的扫描方式等等。
-----------------------------------------------------------------------------------------------------
一步一步深入研究:
执行 explain select * from university; 
会返回该表的一行数据(10列)
myqsl官网描述
-----------------------------------------------------------------------------------------------------
这神秘的10列:
1. id (没啥好说的、查询序号而已,无需大惊小怪)
2. select_type(你使用的查询类型,也许mysql的查询种类就这些吧)
     2.a   SIMPLE(简单的查询,一个普通的select * from tableName就是这样的类型)
    -------------------------------------------------------------------------------------------
     2.b   PRIMARY(最外面的查询)
例子:
一个很普通的子查询,执行后 会返回2列 其中查询序号为1的查询类型就是PRIMARY即最外面(最后)的查询
explain 
  select t.id,t.uni_code,t.uni_name               // ------> 最外面(最后的)查询
  from (select * from university) as t;           // ------> 另一种查询类型,此处先忽略掉
    -------------------------------------------------------------------------------------------
    2.c    DERIVED (FROM子句的子查询)
例子:为了省略字符数,引用2.b的例子
    查询序号1 的 为 PRIMARY 最外的查询
    查询序号2 的 就是 DERIVED了! 即子查询
    -------------------------------------------------------------------------------------------
    2.d    UNION(UNION查询中的第二个或后面的select查询
小知识:何为 UNION查询?
解读:
    

例子:
explain 
    select id from university where id = 1             // 此查询类型为 PRIMARY
    union (all)                                                 // 是使用 union 或 union all 查询类型都为 UNION 
    select uni_id from uni_attrs where uni_id = 1;     // 此查询类型即为 UNION
    -------------------------------------------------------------------------------------------
    2.e    DEPENDENT(中文译为依赖) UNION(UNION中的第二个或后面的SELECT语句
从中文解读译为 依赖的union 即 union是被依赖的 也就是 该union被作为子查询所使用(@ _ @)
例子:
explain 
    select id from university                                        // 此查询类型为 PRIMARY
    where id in (
        select id from university where id = 1                          //  另一种查询类型,此处先忽略掉
        union select id from                                         // 此查询类型为 DEPENDENT UNION 第二个查询
    );
   -------------------------------------------------------------------------------------------
    2.f  DEPENDENT SUBQUERY(和上面的很相似哦~ 子查询中的第一个SELECT
例子:
  引用2.e的例子,
  查询序号1 为 PRIMARY
  查询序号2 即为 DEPENDENT SUBQUERY
  查询序号3 为 刚刚讲过的 DEPENDENT(依赖)UNION
  -------------------------------------------------------------------------------------------
   2.g UNION RESULT(UNION的结果
例子:
    2.e || 2.f
    不知道大家有没有注意到,在运行 2.e 和 2.f 的例子上,都会有一个序号为null的行,类型就是 UNION RESULT
   -------------------------------------------------------------------------------------------
  2.h SUBQUERY(中文译为子查询)(和2.f的很相似哦~ 子查询中的第一个SELECT
例子:
explain 
    select id from university                             // 此查询类型为 PRIMARY
    where id > (
        select id from university where id = 1            // 此查询类型为 SUBQUERY
    );
注意:此例子 与 2.f 的例子很相像,不同的原因可能(个人理解)为:
    本例中的子查询结果为指定的某一条记录,而2.f的子查询结果为多条记录

呼呼...一共8种查询类型,你都掌握了么? 
掌握了就请休息会儿~再继续,没掌握的话把SQL语句执行一下就清楚啦^_^

3. table(输出的行所查询的表)
    这没啥多说的了吧、

4. type(联接类型
    又是一个重要的列!一共11个种类,从最佳类型到最坏类型的排序为:
system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
so、一个一个来讲解啥算最佳啥算最坏吧@_@
    20140430 休刊,有时间再补充~ 敲敲代码去了

    
参考资料:
    http://www.cnitblog.com/aliyiyi08/archive/2008/09/09/48878.html
    http://dev.mysql.com/doc/refman/5.1/zh/optimization.html#explain
    http://www.oicto.com/mysql-explain-show
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值