MySQL中使用explain分析查询SQL

chosen1cwp 2022年01月24日 10次浏览

EXPLAIN命令可以知道MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序

举例使用explain分析如下SQL:

EXPLAIN 
SELECT
	a.*
	m.*
	c.*
	t.*
	w.*
	unix_timestamp(
	now()) AS "ctime",
	unix_timestamp(
	now()) AS "utimeP06" 
FROM
	`agent_base` a
	LEFT JOIN `sys_office` o ON o.`id` = a.`managecom1_id` AND o.`del_flag` = '0'
	LEFT JOIN `accounts_main` m ON m.`agentcode` = a.`agent_code` AND m.`state` = '1' AND m.`del_flag` = '0'
	LEFT JOIN `agent_certif` c ON c.`agent_id` = a.`id` AND c.`certif_type` = '02' AND c.`state` = '01' AND c.`del_flag` = '0'
	LEFT JOIN `agent_tree` t ON t.`agent_code` = a.`agent_code` AND t.`del_flag` = '0'
	LEFT JOIN (SELECT * FROM `warrantor_main` WHERE `del_flag` = '0' AND `cautionerflag` = '0' GROUP BY `agentcode`) w ON w.`agentcode` = a.`agent_code`
WHERE
	a.`del_flag` = '0' LIMIT 9400,50

得到结果

column1column2column3
content1content2content3

一、select_type

表示select的类型,常见的取值有:

1、SIMPLE 简单表,不使用表连接或子查询
2、PRIMARY 主查询,即外层的查询
3、UNION UNION中的第二个或者后面的查询语句
4、SUBQUERY 子查询中的第一个

二、table

输出结果集的表(别名)

三、partitions

匹配的分区

四、type

表示MySQL在表中找到所需行的方式,或者叫访问类型。常见的访问类型如下,从上到下,性能依次变好。
|All|全表扫描|没有where条件或者where条件没有使用到索引的查询SQL|
|-------|-------|-------|
|content1|content2|content3|
|content1|content2|content3|
|content1|content2|content3|
|content1|content2|content3|
|content1|content2|content3|
|content1|content2|content3|

五、possible_keys

表示查询可能使用的索引

六、key

实际使用的索引

七、key_len

使用索引字段的长度

八、ref

使用那个列或常数与key一起从表中选择行

九、rows

表示扫描行的数量

十、filtered

存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例

十一、Extra

执行情况的说明和描述,包含不适合在其他列中显示但是对执行计划非常重要的额外信息

|Using Index|表示索引覆盖,不会回表查询|
|-------|-------|-------|
|Using Where|表示进行了回表查询|
|Using Index Condition|表示进行了ICP优化|
|Using Flesort|表示MySQL需额外排序操作, 不能通过索引顺序达到排序效果|

什么是ICP?

MySQL5.6引入了Index Condition Pushdown(ICP)的特性,进一步优化了查询。Pushdown表示操作下放,某些情况下的条件过滤操作下放到存储引擎。

MySQL使用了ICP来进一步优化查询,在检索的时候,把条件customer_id>=300 AND customer_id<=400< span>也推到存储引擎层完成过滤,这样能够降低不必要的IO访问。

Extra为Using index condition就表示使用了ICP优化。