MySql explain结果extra字段含义自测

using index :性能好,索引覆盖,只从索引文件中获取,无需回表查询

using where:在查找使用索引的情况下,条件查找中需要回表去查询所需的数据

using index condition:在5.6版本后加入的新特性:使用了ICP(Index Condition Pushdown)技术,在存储引擎层根据索引尽量过滤符合where条件的记录,减少返回server层的记录。是需要回表的。eg:有索引(a, b, c) select a,c,d from TABLE where a=1000 and c=2000 根据最左匹配,where中的条件只能走a,使用索引下推技术根据c筛选,而d字段不在索引内,所以需要回表,但是where中的条件都在索引内,不需要use where。

using index & using where:查找使用了覆盖索引,又因为需要的数据、条件列都在索引中能找到,所以不需要回表查询数据 。但是where中的条件不能正常完全走索引,使用类似索引下推的筛选,故会显示use where 来进行条件筛选。eg:有索引(a, b, c) select a,b from TABLE where a=1000 and c=2000;根据最左匹配,故只能走a,但是using index & using where会使用索引下推,将满足符合判断c的列筛选出,又因为取得数据均在索引内有,故不需要回表。

using index condition & using where:

①出现于使用索引下推,且需要查询的字段不够即不是覆盖索引,但where中还有其他条件 eg:有索引(a, b,c),select a,c,d from TABLE where a=1000 and c=2000 and d=3000;根据最左匹配,只能走a,使用索引下推使用c字段筛选,故使用 use index condition。但是where中的条件并不都在索引内,d需要回表查询,故使用use where

②出现于group by操作中,条件走了一部分索引,group by也可以走索引,但是仍需回表取其他字段。eg:有索引(a,c) select c,count( id ) from TABLE where a=1000 and b=2000 group by c; 根据最左匹配,理论上只能走a,但是走c是可以使引擎不自己进行排序的,故引擎选择走c。又因为c不是做的值判断能操作,故显示use index condition。又因为查询条件中有b,而索引中没有b,故需要use where

你可能感兴趣的:(技术问题,java,mysql,数据库,索引)