MySQL中EXPLAIN解释命令
2016-12-18 00:00
260 查看
使用方法
EXPLAIN命令显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。使用方法,在select语句前加上explain,如:
1 | explain select page_id form pic where id=1 |
参数说明
数据表
头像表-pic(描述用户头像地址):# | 名字 | 类型 | 空 | 额外 | 注释 |
1 | id | int(11) | 否 | AUTO_INCREMENT | 主键 |
2 | user_id | int(11) | 否 | user表id | |
3 | url | varchar(64) | 否 | 地址 |
# | 名字 | 类型 | 空 | 额外 | 注释 |
1 | id | int(11) | 否 | AUTO_INCREMENT | 主键 |
2 | name | char(38) | 否 | INDEX | 名字 |
3 | desc | varchar(64) | 否 | 描述 | |
4 | create_time | int(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又比较大,通常意味着你需要调整查询语句,或者需要添加索引,总之需要尽量消除这两个信息。
相关文章推荐
- 详解MySQL中EXPLAIN解释命令(转)
- 详解MySQL中EXPLAIN解释命令
- 详解MySQL中EXPLAIN解释命令
- 详解MySQL中EXPLAIN解释命令
- 详解MySQL中EXPLAIN解释命令
- 详解MySQL中EXPLAIN解释命令
- 详解MySQL中EXPLAIN解释命令
- 使用MySQL中的EXPLAIN解释命令来检查SQL
- 使用MySQL中的EXPLAIN解释命令来检查SQL
- 详解MySQL中EXPLAIN解释命令
- 详解MySQL中EXPLAIN解释命令
- 详解MySQL中EXPLAIN解释命令
- 使用MySQL中的EXPLAIN解释命令来检查SQL
- 详解MySQL中EXPLAIN解释命令
- 详解MySQL中EXPLAIN解释命令
- 详解MySQL中EXPLAIN解释命令
- 详解MySQL中EXPLAIN解释命令
- 详解MySQL中EXPLAIN解释命令
- 详解MySQL中EXPLAIN解释命令(转)
- mysql 中 explain 的解释命令