Mysql 性能优化Explain详解

功能
我们在日常使用中,使用慢查询找到执行时间比较久的查询,然后使用SHOW STATUS、SHOW PROFILE、和explain做单条语句的分析。
使用explain关键字可以模拟优化器执行sql查询语句,从而知道Mysql是如何处理你的sql语句的。分析你的查询语句或者表结构的性能瓶颈。


具体可以分析哪些

表的读取顺序

数据读取操作的操作类型

哪些索引可以使用

哪些索引被实际使用

表之间的引用

每张表有多少行被优化器查询


使用语法
explain sql语句

Mysql 性能优化Explain详解

 

 

得到了什么结果
expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra

Mysql 性能优化Explain详解


字段概要解释:

id:选择标识符

select_type:表示查询的类型。

table:输出结果集的表

partitions:匹配的分区

type:表示表的连接类型

possible_keys:表示查询时,可能使用的索引

key:表示实际使用的索引

key_len:索引字段的长度

ref:列与索引的比较

rows:扫描出的行数(估算的行数)

filtered:按表条件过滤的行百分比

Extra:执行情况的描述和说明

 

字段详细解释

一、 id
SQL执行查询的顺序的标识
1. id相同时,执行顺序由上至下

Mysql 性能优化Explain详解

2. id不同时,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

Mysql 性能优化Explain详解

3. id相同和不同同时存在,id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行

Mysql 性能优化Explain详解

 

 

二、select_type
查询中每个select子句的类型,主要用于区别普通查询、联合查询、子查询等复杂查询
(1) SIMPLE(简单SELECT,不使用UNION或子查询等)
(2) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
(3) UNION(UNION中的第二个或后面的SELECT语句)
(4) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)
(5) UNION RESULT(UNION的结果,union语句中第二个select开始后面所有select)
(6) SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)
(7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询)
(8) DERIVED(派生表的SELECT, FROM子句的子查询)
(9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)


三、table
显示这一步所访问数据库中表名称(显示这一行的数据是关于哪张表的)


四、type

表示MySQL在表中找到所需行的方式,又称“访问类型”,常见类型如下:

 ALL, index,  range, ref, eq_ref, const, system, NULL

从左到右,性能从最差到最好

Mysql 性能优化Explain详解

 

 一般来说。得保证查询至少达到range级别,最好能达到ref。

所有的访问类型排序:

Mysql 性能优化Explain详解

system:表只有一行记录(等于系统表),这是const类型的特别,平时不会出现,这个可以忽略不计。

const:表示通过索引一次就找到了,const用于比较primary key或者unique索引,因为只匹配一行数据,所以很快
如将主键置于where列表中,Mysql就能将该查询转换为一个常量

eq_ref:唯一性索引扫描,对于每个索引键,表只只有一条记录与之匹配。常见于主键或唯一索引扫描

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwxsw.html