Mysql通过EXPLAIN 分析低效SQL 的执行计划

通过以上步骤查询到效率低的SQL 语句后,可以通过EXPLAIN 或者DESC 命令获取MySQL
如何执行SELECT 语句的信息,包括在SELECT 语句执行过程中表如何连接和连接的顺序,比
如想计算2006 年所有公司的销售额,需要关联sales 表和company 表,并且对moneys 字段
做求和(sum)操作,相应SQL 的执行计划如下:

mysql> explain select sum(moneys) from sales a,company b where a.company_id = b.id and a.year
= 2006\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: a
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1000
Extra: Using where
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: b
type: ref
possible_keys: ind_company_id
key: ind_company_id
key_len: 5
ref: sakila.a.company_id
rows: 1
Extra: Using where; Using index
2 rows in set (0.00 sec)
每个列的简单解释如下:
 select_type:表示SELECT 的类型,常见的取值有SIMPLE(简单表,即不使用表连接
或者子查询)、PRIMARY(主查询,即外层的查询)、UNION(UNION 中的第二个或
者后面的查询语句)、SUBQUERY(子查询中的第一个SELECT)等。
 table:输出结果集的表。
 type:表示表的连接类型,性能由好到差的连接类型为system(表中仅有一行,即
常量表)、const(单表中最多有一个匹配行,例如primary key 或者unique index)、
eq_ref(对于前面的每一行,在此表中只查询一条记录,简单来说,就是多表连接
中使用primary key或者unique index)、re(f 与eq_ref类似,区别在于不是使用primary
key 或者unique index,而是使用普通的索引)、ref_or_null(与ref 类似,区别在于
条件中包含对NULL 的查询)、index_merge(索引合并优化)、unique_subquery(in
的后面是一个查询主键字段的子查询)、index_subquery(与unique_subquery 类似,
区别在于in 的后面是查询非唯一索引字段的子查询)、range(单表中的范围查询)、
index(对于前面的每一行,都通过查询索引来得到数据)、all(对于前面的每一行,
都通过全表扫描来得到数据)。
 possible_keys:表示查询时,可能使用的索引。
 key:表示实际使用的索引。
 key_len:索引字段的长度。
 rows:扫描行的数量。
 Extra:执行情况的说明和描述。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值