结绳记事,总结,思考,方有成长~
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')
-
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
- const/system:MySQL对查询的某部分优化,并转换为一个常量时,可使用这些类型进行访问。如将主键至于 WHERE 列表中,MySQL就能将该查询转换为一个常量。system 是 const类型的特列,当查询的表中只有一行的情况下,既是 system。
EXPLAIN SELECT * FROM order_info a
WHERE a.order_id = '202003090015'
- NULL:MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,这个厉害了
EXPLAIN EXTENDED SELECT * FROM order_info a
WHERE a.order_id = (SELECT min(order_id) FROM sku_info);
SHOW 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无法使用索引完成的排序操作成为“文件排序”。