赞
踩
在我们日常工作中,我们可能会遇到一些慢SQL语句或者要对一些SQL进行性能优化,那么就需要使用explain对SQL进行执行计划分析了。Mysql中的执行计划可以通过EXPLAIN或DESCRIBE关键字获取,当我们拿到执行计划后可以帮助我们分析这条sql执行的性能瓶颈在哪里。
例如,我有一张user表,我想分析一下查询的执行计划。
SELECT * FROM user WHERE age > 28;
可以使用EXPLAIN来获取这条sql语句的执行计划。
EXPLAIN SELECT * FROM user WHERE age > 28;
通过执行上面的EXPLAIN语句后,我们就能拿到这条sql的执行计划了。
- +----+-------------+----------------+------------+------+---------------+------+---------+------+------+----------+-------------+
- | id | select_type | table| partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
- +----+-------------+----------------+------------+------+---------------+------+---------+------+------+----------+-------------+
- | 1 | SIMPLE | user | NULL | range| age | age | 5 | NULL | 50| 33.33 | Using where |
- +----+-------------+----------------+------------+------+---------------+------+---------+------+------+----------+-------------+
接下来我们就可以对执行计划进行分析了。
从上面的执行计划可以看到,一共有12个字段,我们先对这些字段依次介绍一下。
执行计划中每个操作的唯一标识,对于执行计划中的每条sql,可能会有多个操作,每个操作都有一个唯一的id。
操作类型,一共包含一项几种类型:
当前操作锁涉及的表。
当前操作所涉及的分区。
表示MySQL在执行查询时所采用的检索方式,他是衡量查询性能的重要指标之一。以下时常用的类型和含义:
故以上类型执行效率由高到低:system > const > eq_ref > ref > range > index > all
表示查询中可以使用的索引,不一定实际使用了这些索引。这个字段列出了可能用于这个查询的所有索引,也包括联合索引。
表示实际查询使用的索引。
表示索引的长度,索引的长度越短,查询时的效率越高。
用来表示哪些列或常量被用来与key列中命名的索引进行比较。
表示操作需要扫描的行数,也就是说需要扫描表中多少行才能得到结果。
表示本次操作过滤掉的行数占扫描行数的百分比。值越大,则查询结果越准确。
这个字段经常会被忽略,其实也很重要。这个字段表示MySQL在执行查询时所作的一些附加操作。下面是一些常见的extra类型及其含义:
通过对执行计划的各个字段进行了分析和说明,我们在进行sql优化的时候,尽可能使用最优的方式来提高性能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。