mysql> explain select * from siteinfo;
+----+-------------+----------+------+---------------+------+---------+------+--------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+--------+-------+
| 1 | SIMPLE | siteinfo | ALL | NULL | NULL | NULL | NULL | 902310 | |
+----+-------------+----------+------+---------------+------+---------+------+--------+-------+
只说type
system:
表仅有一行,这是const连接类型的一个特例
const:
const用于常数值比较primary key时,单查询的表仅有一行时,使用system
eq_ref:
除const类型外最好的可能实现的连接类型 它用在一个索引的所有部分被连接使用并且索引是unique或primary key
对于每一个索引键,表中只用一条记录与之匹配
ref:
连接不能基于关键字选择单个行,可能查找到多个符合条件的行。叫做ref是因为索引要跟某个参考值相比较。
这个参考值或者是一个常数,或者是来自一个表里的多表查询的结果值。
ref_or_null:
如同ref,但是MySQL必须在初次查找的结果里找出null条目,然后进行二次查找。
index_merge:
说明索引合并优化被使用
unique_subquery:
在某些IN查询中使用此种类型,而不是常规的ref:
value IN (SELECT primary_key FROM single_table WHERE some_expr)
index_subquery:
在某些IN查询中使用此种类型,与unique_subquery类似,但是查询的是非唯一性索引:
value IN (SELECT key_column FROM single_table WHERE some_expr)
range:
只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引。当使用=、<>、>、>=、<、<=、
IS NULL、<=>、BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range。
index:
全表扫描,只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序,但是开销仍然非常大。
all:
全表扫描
possible key : 可能使用到的索引
key : 实际使用到的索引
MySQL实际从possible_key选择使用的索引。如果为NULL,则没有使用索引。
很少的情况下,MYSQL会选择优化不足的索引。
这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引
或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引
key_len: 索引长度,在不损失精确性的情况下,长度越短越好
ref: 说明索引的哪一列被使用了,
rows: 检索的行数
extra项:
userfilesort
表示MySQL会对结果使用一个外部索引排序,而不是从表里按索引次序读到相关内容。
可能在内存或者磁盘上进行排序。MySQL中无法利用索引完成的排序操作称为“文件排序”。
using temporary
表示MySQL在对查询结果排序时使用临时表。常见于排序order by和分组查询group by。
摘自: http://wenku.baidu.com/view/f7335cc8da38376baf1fae5d.html