MySql使用explain分析时Extra列中Using index condition,Using index,Using where,Using index;Using where的区别

1 Using index
表示覆盖索引即可满足查询要求,覆盖索引就是指索引的叶子节点包含了要查询的数据。如下查询,其中id是自增主键。就是说这条查询不需要通过实际表来返回数据,直接通过id主键索引就能返回索引的值。这种情况不回表。(回表简单来说就是MySQL内部需要经过两次查询,第一次先索引扫描,然后再通过主键去取索引中未能提供的数据。因为主键索引树的叶子节点直接就是我们要查询的整行数据,而非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次查询。)
1
2 Using where; Using index
表示首先存储引擎通过索引检索将检索结果返回,再通过where语句对检索结果进行过滤。表示select的数据在索引中能找到,但需要根据where条件过滤,这种情况也不回表。
在这里插入图片描述
3 Using where
表示MySQL将对存储引擎层提取的结果进行过滤,过滤条件字段无索引。有可能产生回表。只有在使用了索引,且Extra是Using where的情况下,才代表回表查询数据。
在这里插入图片描述
4 Using index condition
会先条件过滤索引,过滤完索引后找到所有符合索引条件的数据行,随后用 WHERE 子句中的其他条件去过滤这些数据行。下图查询中name和age和pos是一个联合索引。(用到了ICP,参考[https://www.zhihu.com/search?type=content&q=using%20index%20condition])
关闭ICP是这样的:1. 从索引里面取出下一条pid=14的记录,然后利用主键字段读取整个行。2. 然后对这个完整的行利用其余的条件这个进行判断看是否符合条件,在Server层进行过滤和处理。开启ICP是这样的:1. 从索引里面取出下一条pid=14的记录,然后利用这个索引的其他字段条件进行判断,如果条件成立,执行第2步。在引擎层上进行过滤和处理。2. 在上一步中筛选出来符合条件的才会利用主键索引里面找到这个完整行,返回。
在这里插入图片描述
5 为空的情况
需要根据具体情况具体分析。
在这里插入图片描述

你可能感兴趣的:(技术)