文章目录
MySql —— EXPLAIN 索引处理情况简介字段详解IDID解读 SELECT_TYPETABLETYPEPOSSIBLE_KEYSKEYKEY_LENREFROWSEXTRAUsing filesortUsing temporaryUsing indexUsing whereUsing join bufferimpossible whereselect tables optimized awaydistinctMySql —— EXPLAIN 索引处理情况
简介
如果遇到一条SQL很慢,我们可以通过EXPLAN 命令分析SQL索引情况。
字段详解
ID
select查询的序列号,包含一组数字,表示执行select子句或操作表的顺序。
ID解读
ID相同时,顺序从上至下上述加载顺序则是 US -> UBID不同,在子查询情况下,ID的序号会递增,ID的值越大优先级越高,越先执行:
ID出现相同时,可以认为相同ID是同一分组,从上往下顺序执行;依然ID越大,优先级越高,越先执行。
SELECT_TYPE
表示查询类型,用于区分普通查询、联合查询、自查询等查询方式。
TABLE
当前执行的表(如果起别名,显示别名)
TYPE
显示查询使用了哪种类型,type包含的类型包括如下图所示的几种:
ALL、INDEX、RANGE、REF、EQ_REF、CONST,SYSTEM、NULL
SYSTEM
表只有一行记录(等于系统表),这是CONST类型的特列,平时不出现,可以忽略不计。CONST
表示通过索引一次查找到,即是通过索引列进行查询。EQ_REF
唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见主键或唯一性索引扫描。REF
非唯一性索引扫描,返回匹配某字段的所有行(例如使用了COUNT、SUM、AVG集合统计函数),本质上也是一种索引,返回所有匹配某个字段的所有行,然而,满足条件的可能为多列,所以它是属于查找和扫描的结合体。RANGE
只检索给定范围的行,使用一个索引来选择行,KEY列显示使用哪个索引,通常在WHERE后面使用BETWEEN、<、>、IN等查询时出现,属于范围型全局扫描。因为它开始于指定索引的某一点,而指定结束一边,所以不用扫描全部索引。
INDEX
INDEX只遍历索引树,通常比ALL快,因为索引文件通常比数据文件小。(虽然INDEX和ALL都是读取全表,但是INDEX是通过索引读,而ALL是通过硬盘扫描所有行。)
ALL
遍历全表好到匹配行,性能很低。
POSSIBLE_KEYS
POSSIBLE_KYE显示可能应用到此表中的索引,一个或多个。查询语句中的字段如果使用了索引,会显示在这里,但不一定会被用到!!!!!
KEY
KEY实际使用的索引,如果为NULL,则没有使用到索引。(可能是索引建立失败导致)
如果出现索引覆盖,SELECT后要查询的字段刚好和创建的索引字段相同 (名称),则该索引仅出现在KEY列中。
KEY_LEN
表示索引中使用的字节数,在不损失精度的情况下,越短越好。KEY_LEN显示的值为索引字段最大长度,并非实际长度,即,KEY_LEN根据列定义计算得出,而非检索得出。
REF
显示索引被使用的列,最好是一个常数。哪些列或常量被用于查找索引列上的值。
ROWS
根据表统计信息及索引选用情况,估算出找到所需记录要读取的行数,ROWS越小越好。
EXTRA
包含不适合在其它列中显式但十分重要的额外信息。
Using filesort
说明MySql对数据使用了一个外部的索引排序,而不是按照表内的索尼顺序进行读取。MySql中无法利用索引完成的排序操作称作“文件排序。”
EXPLAINSELECT* FROM USER USWHERE US.ID IS NOT NULLORDER BY US.REGISTER_TIME DESC;
Using temporary
使用临时表保存中间结果,MySql在对查询结果排序时使用临时表。常见于排序ORDER BY和分组查询GROUP BY。
Using index
表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错。如果同时出现using where,表明索引被用来执行索引键值的查找;如果没有同时出现using where,表明索引用来读取数据而非执行查找动作。
Using where
表明使用了where过滤。
Using join buffer
表明使用了连接缓存,比如说在查询的时候,多表join的次数非常多,那么将配置文件中的缓冲区的join buffer调大一些。
impossible where
where子句的值总是false,不能用来获取任何元组
select tables optimized away
在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。
distinct
优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作。