,写Explain,简单粗暴的记录一下,日常使用Explain就是查看目标SQL是否使用了索引,也就是索引的使用情况,但是我没写这篇文章,之前用Explain,全靠猜。写这个的目的是为了自己整理和学习。OK,使用场景一般是这样的:在查询语句前加explain,分析SQL语句mysql>explainselect*fromservers;+----+------------+--------+------+--------------+------+--------+-----+-----+--------+|编号|选择类型|表|类型|可能的键|钥匙|密钥长度|参考|行|额外|+----+------------+--------+------+--------------+-----+--------+-----+-----+-------+|1|简单|服务器|所有|空|空|空|空|1|空|+----+------------+----------+------+----------------+------+--------+------+-----+--------+组中的行(0.03秒)分析结果有10列,分别是id,select_type,table,type,possible_keys,key,key_len,ref,Rows,Extra,一一解释,不要在IDmysql执行计划中勾上ID,如果ID是同样的,可以认为是一个组,从上到下依次执行。在每组ID中,ID越大优先级越高越早执行select_type(1)SIMPLE(简单SELECT,不使用UNION或子查询等)(2)PRIMARY(如果查询包含任何复杂的子部分,最外面的选择标记为PRIMARY)(3)UNION(UNION中的第二个或后续SELECT语句)(4)DEPENDENTUNION(UNION中的第二个或后续SELECT语句,取决于外部查询)(5)UNIONRESULT(UNION的结果)(6)SUBQUERY(UNION中的第一个SELECT语句子查询)(7)DEPENDENTSUBQUERY(子查询中第一个SELECT,依赖于外查询)(8)DERIVED(派生表的SELECT,FROM子句的子查询)(9)UNCACHEABLESUBQUERY(结果asubquerycannotbecached,andthefirstrowoftheexternallinkmustbere-evaluated)表查询中哪张表的信息类型找到了具体的行,使用的类型分为以下几种:常用的类型分别是:ALL,index,range,ref,eq_ref,const,system,NULL(从左到右,性能从差到好)具体解释:ALL:FullTableScan,MySQL进行全表扫描,找到匹配的行index:FullIndexScan,index和ALL的区别在于索引类型只遍历rses索引树范围:只检索给定范围内的行,并使用索引来选择行:和ref类似,不同的是使用的索引是唯一索引。对于每个索引键值,表中只有一条记录匹配。简单来说,就是在多表连接中使用主键或者唯一键作为关联条件const,系统:当MySQL对查询的某一部分进行优化,将其转化为常量时,使用这些类型的访问如放置where列表中的主键,MySQL可以将查询转化为常量,system是const类型的特例。当查询表只有一行时,使用systemNULL:MySQL在优化过程中分解语句,执行时甚至不需要访问表或索引。比如从一个索引列中选择最小值,可以单独索引查找完成。possible_keys表示MySQL可以使用哪个索引来查找表中的记录。如果查询涉及的字段上有索引,则索引会被列出来,但不一定被查询使用。此列的使用完全独立于EXPLAIN输出中显示的表的顺序。这意味着possible_keys中的某些键实际上不能用于生成的表顺序。如果该列为NULL,则没有关联索引。在这种情况下,您可以通过检查WHERE子句以查看它是否引用某些列或适合索引的列来提高查询性能。如果是这样,创建一个适当的索引并用EXPLAIN再次检查查询keykey列以显示MySQL实际决定使用哪个键(索引)!!这个强烈建议重点关注,如果没有选择索引,key为NULL。要强制MySQL使用或忽略possible_keys列上的索引,请在查询中使用FORCEINDEX、USEINDEX或IGNOREINDEX。key_len表示索引使用的字节数,通过该列可以计算出查询中使用的索引长度(key_len显示的值是索引字段的最大可能长度,不是实际使用的长度,即是,key_len是根据表定义计算的,不是从表中取的)不损失精度,越短越好ref表示上表的连接匹配条件,即用哪些列或常量来查找值索引列上的rows表示MySQL根据表统计信息和索引选择,估计需要读取的行数才能找到需要的记录Extra该列包含了MySQL解决查询的详细信息,有以下几种情况:Usingwhere:column数据来自于只使用表返回的索引信息而不读取实际动作。当表的所有请求列都是同一个索引的一部分时会发生这种情况,表明mysql服务器将在存储引擎检索到该行后进行过滤。Usingtemporary:表示MySQL需要使用临时表来存储结果集,常见于排序和分组查询Usingfilesort:MySQL中不能使用索引完成的排序操作称为“文件排序”Usingjoinbuffer:改变的值强调获取连接条件时不使用索引,需要一个连接缓冲区来存储中间结果。如果出现这个值,需要注意的是根据查询的具体情况,可能需要增加索引来提高性能。Impossiblewhere:该值强调where语句将导致没有符合条件的行。Selecttablesoptimizedaway:该值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行摘要:?EXPLAIN不会告诉您有关触发器、存储过程或用户定义函数的信息。情况?EXPLAIN没有考虑各种缓存?EXPLAIN不能显示MySQL在执行查询时所做的优化工作?一些统计信息是估计的,不是精确值?EXPALIN只能解释SELECT操作,其他操作必须重写为SELECT和然后查看并执行计划。
