sql优化

explain命令

通过explain关键词来分析sql语句,从而对sql语句进行针对性的优化。

用法

在select语句前加上explain关键词。

EXPLAIN SELECT * FROM sys_user u INNER JOIN sys_user_role r ON u.id_ = r.user_id

结果分析

id

语句的执行顺序标识,如果在语句中没有子查询或联合,说明只有一个SELECT,于是这个列显示为1,否则内层的SELECT会顺序编号。

select_type

显示了对应的查询是简单还是复杂SELECT。显示每个select语句的类型。

类型

描述

SIMPLE

简单类型,语句中没有子查询或union

PRIMARY

查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY

UNION

union是在select 语句中第二个select语句后面所有的select

DEPENDENT UNION

UNION中的第二个或后面的SELECT语句,取决于外面的查询

UNION RESULT

UNION的结果

SUBQUERY

子查询中的第一个SELECT

DEPENDENT SUBQUERY

子查询中的第一个SELECT,取决于外面的查询

DERIVED

生表的SELECT, FROM子句的子查询

UNCACHEABLE SUBQUERY

一个子查询的结果不能被缓存,必须重新评估外链接的第一行

table

输出行所引用的表。

type

联合查询所使用的类型,type显示的是访问类型,是较为重要的一个指标。结果值从好到坏依次是:system > const > eq_ref > ref >fulltext > ref_or_null > index_merge > unique_subquery >index_subquery > range > index > ALL。

类型

描述

ALL

全表扫描,效果是最不理想的。

const

const 最多匹配一行并且使用primarykey 或 unique索引,才会是const。

eq_ref

最多只会有一条匹配结果,一般是通过主键或唯一键索引来访问。一般会出现在连接查询的语句中。

ref

也叫索引查找,他返回所有匹配某单个值的行,它可能会找到多个符合条件行。

ref_or_null

与ref的唯一区别就是在使用索引引用的查询之外再增加一个空值的查询。

index_merge

查询中同时使用两个(或更多)索引,然后对索引结果进行合并(merge),再读取表数据。

unique_subquery

子查询中的返回结果字段组合是主键或唯一约束。

index_subquery

子查询中的返回结果字段组合是一个索引(或索引组合),但不是一个主键或唯一索引。

range

索引范围扫描。一个有限制的索引扫描,它开始于索引里的某一点,返回匹配这个值域的行(显而易见的范围扫描.即带有BETWEEN或在WHERE子句中带有>的查询,当MySQL使用索引去查找一系列值的时候,如IN()和OR列表,也为显示的范围扫描)。

index

全表扫描,只是扫描表的时候按照索引次序 进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。

fulltext

进行全文索引检索。

system

系统表,表中只有一行数据。

possible_keys

指出能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用。

key

key列显示实际决定使用的索引。如果没有选择索引,键是NULL。要想强制使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

ley_len

key_len列显示mysql决定使用的键长度,如果键是null,则长度为null。显示MySQL在索引里使用的字节数.举个例子就是在查询中使用到了主键,而主键的数据类型为INT,则为4,SMALLINT则为2。使用的索引长度,一般越短越好。

ref

显示索引的那一列被引用到了。

rows

显示的是为了找到所需的值而要读取的行数。

extra

显示额外的信息。

优化技巧

Last updated