您的位置:首页 > 数据库 > MySQL

MySQL中EXPLAIN解释命令

2016-12-18 00:00 260 查看

使用方法

EXPLAIN命令显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

使用方法,在select语句前加上explain,如:

1explain select page_id form pic where id=1

参数说明

数据表

头像表-pic(描述用户头像地址):

#名字类型额外注释
1idint(11)AUTO_INCREMENT主键
2user_idint(11)user表id
3urlvarchar(64)地址
用户表-user(描述用户信息):

#名字类型额外注释
1idint(11)AUTO_INCREMENT主键
2namechar(38)INDEX名字
3descvarchar(64)描述
4create_timeint(11)时间

参数

重点关注type和Extra列

一,table

显示这一行的数据是关于哪张表的

二,type

这是重要的列,显示连接使用了何种类型,从最好到最差经常见到的type说明如下:

1,system

const类型的特列

2,const

表最多有一个匹配行,用于比较primary key或者unique索引

explain select * form pic where id=1

3,eq_ref

对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY

explain select * from pic,user where pic.user_id = user.id

4,ref

连接不能基于关键字选择单个行,可能查找到多个符合条件的行。叫做ref是因为索引要跟某个参考值相比较。这个参考值或者是一个常数,或者是来自一个表里的多表查询的结果值。

explain SELECT name FROM `user` WHERE name='1';

5,ref_or_null

如同ref,但是MySQL必须在初次查找的结果里找出null条目,然后进行二次查找

以上五种是最优的

6,range

只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引。当使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range

7,index

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

explain SELECT name FROM `user` WHERE name=1

8,ALL

最坏的情况,从头到尾全表扫描

explain SELECT * FROM `user` WHERE name=1

三,possible_keys

显示可能应用在这张表中的索引。如果为空,没有可能的索引,不太重要

四,key

MySQL实际从possible_key选择使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引

五,key_len

使用的索引的长度。在不损失精确性的情况下,长度越短越好

六,ref

显示索引的哪一列被使用了,如果可能的话,是一个常数

七,rows

MYSQL认为必须检查的用来返回请求数据的行数

八,Extra

关于MYSQL如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢

1,Distinct

一旦MYSQL找到了与行相联合匹配的行,停止为当前的行组合搜索更多的行

2,Not exists

MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了

3,Range checked for each Record(index map:#)

没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一

4,Using filesort

看到这个的时候,查询就需要优化了。不是“使用文件索引”的含义!filesort是MySQL所实现的一种排序策略,通常在使用到排序语句ORDER BY的时候,会出现该信息。

5,Using index

仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候。如果只有 Using index,说明他没有查询到数据表,只用索引表就完成了这个查询,这个叫覆盖索引。如果同时出现Using where,代表使用索引来查找读取记录, 也是可以用到索引的,但是需要查询到数据表。

6,Using temporary

看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上Where used 使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)

7,using where

表示条件查询,如果不读取表的所有数据,或不是仅仅通过索引就可以获取所有需要的数据,则会出现 Using where。如果type列是ALL或index,而没有出现该信息,则你有可能在执行错误的查询:返回所有数据。

如果EXPLAIN出现后面两个信息(Using filesort,Using temporary),而rows又比较大,通常意味着你需要调整查询语句,或者需要添加索引,总之需要尽量消除这两个信息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: