、执行explain后的结果项介绍:
a、id,sql的查询序列号,即sql语句的执行顺序
b、select_type,
simple:表示简单的select,没有union和子查询。
primary:最外面的select,在有子查询的语句里。
union:union语句的第二个或者是后面那一个(前一个是primary)//union:两个查询的并集,详情:http://blog.csdn.net/yl2isoft/article/details/16922403
dependent uion:union中的第二个或者是后面的那一个。
union result:union的结果
c、table 。
d、type 链接类型。
system:表仅有一行。
const:表最多有一个匹配行,用于比较primary key或者 unique索引。
eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY。(mysql手册)。
explain
select
count(orde.id)
from
t_app_order as orde,
t_app_ordertrace as ordertrace
where
orde.id=ordertrace.order_id
and
orde.banjia_time>ordertrace.time
and
ordertrace.operation=301
ref:ref 对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。
explain select * from t_app_ordertrace where order_id=xx
ref_or_null: 该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。在解决子查询中经常使用该联接类型的优化
该5中类型为理想类型。
index_merge 该联接类型表示使用了索引合并优化方法。在这种情况下,key列包含了使用的索引的清单,key_len包含了使用的索引的最长的关键元素。
unique_subquery
index_subquery
range 给定范围内的检索,使用一个索引来检查行 ,放在in下的字段最好有很高的辨识度。
index 该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。(也就是说虽然all和Index都是读全表,但index是从索引中读取的,而all是从硬盘中读的)
ALL 对于每个来自于先前的表的行组合,进行完整的表扫描。如果表是第一个没标记const的表,这通常不好,并且通常在它情况下很差。通常可以增加更多的索引而不要使用ALL,使得行能基于前面的表中的常数值 或列值被检索出。
e、possible_keys 使用那个索引会在表中找到该列。
f、keys:mysql使用的索引。
g、key_len:索引的长度。
h、ref:ref列显示使用哪个列或常数与key一起从表中选择行。
i、rows:rows 显示MYSQL执行查询的行数,简单且重要,数值越大越不好,说明没有用好索引
j、Extra:解决查询的详细信息。
Distinct: MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行
Not exists:
range checked for each record:没有找到合适的索引。
using filesort :MySQL需要额外的一次传递,以找出如何按排序顺序检索行。通过根据联接类型浏览所有行并为所有匹配WHERE子句的行保存排序关键字和行的指针来完成排序。然后关键字被排序,并按排序顺序检 索行。
using index 只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的信息。这个比较容易理解,就是说明是否使用了索引
using where
Using sort_union(...), Using union(...),Using intersect(...)
Using index for group-by