MySQL中如何使用 explain 来帮助优化查询语句

每条 SQL语句的性能对于用户多高并发的系统来说都至关重要,没提高一点性能都能为系统减少不少负担,减少我们硬件的投入。
那么我们如何来优化 SQL查询语句呢。一般来说使用索引的查询比为使用索引的查询性能高很多,使用的索引类型以及排序列,查询条件都会影响查询的性能。这种情况下我们可以通过 explain语句来分析查询中所使用的索引,查询的类型,结果的数据行数等信息,来帮助我们分析 SQL语句执行的细节,从而根据相关细节来优化查询语句。
explain 一般会为我们提供如下信息:

id Mysql Query Optimizer选定的执行计划中的序列号(查询序列号)
select_type select查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询。

SIMPLE
简单SELECT(不使用UNION或子查询)
PRIMARY
最外面的SELECT
UNION
UNION中的第二个或后面的SELECT语句
DEPENDENT UNION
UNION中的第二个或后面的SELECT语句,取决于外面的查询
UNION RESULT
UNION的结果。
SUBQUERY
子查询中的第一个SELECT
DEPENDENT SUBQUERY
子查询中的第一个SELECT,取决于外面的查询
DERIVED
导出表的SELECT(FROM子句的子查询)
table 所引用的表。
type 显示的是访问类型,结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > range > index > ALL

说明:

const
读常量,只读一次,一般是主键
DEPENDENT SUBQUERY
子查询中的第一个SELECT,取决于外面的查询
eq_ref
最多只会有一个匹配结果,一般是通过主键或者唯一索引来访问
DEPENDENT SUBQUERY
子查询中的第一个SELECT,取决于外面的查询
ref
这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中 读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好
DEPENDENT SUBQUERY
子查询中的第一个SELECT,取决于外面的查询
unique_subquery
子查询中返结果字段组合是主键或唯一索引
DEPENDENT SUBQUERY
子查询中的第一个SELECT,取决于外面的查询
range
索引范围扫描,使用 > 或 < 时发生
DEPENDENT SUBQUERY
子查询中的第一个SELECT,取决于外面的查询
index
全索引扫描
DEPENDENT SUBQUERY
子查询中的第一个SELECT,取决于外面的查询
ALL
全表扫描,这一般比较糟糕,应该尽量避免
possible_keys 指出MySQL能使用哪个索引在该表中找到行。如果是空的,没有相关的索引。
这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。
key 显示MySQL实际决定使用的键。如果没有索引被选择,键是NULL
ref 显示哪个字段或常数与key一起被使用。
rows 通过收集系统信息估算出来的结果记录条数
extra 查询中,每一步会进行的额外信息

Post a Comment

Your email is never shared. Required fields are marked *

*
*