尚硅谷Mysql高级day5(p29-30)

今天是2021-1-1。

一。explain-extra

包含不适合在其他列中显示但十分重要的额外信息,包含以下信息:

1.Using filesort:如果order子句中出现的字段没有使用到索引,那么mysql会使用一个外部的索引排序来排序这些字段的值--可以说是重新扫描整张表来排序,而不是我们可能建立好的索引来对字段排序
2.Using temporary:这里有很多因素,比如:排序、分组时涉及到的字段未使用索引;多表连接查询时,查询条件中没有使用最开始的基表中的字段作为查询条件,即多个表中,有与最开始的基表非直接关联的表。
3.using index:单独出现时,表示select子句的字段都使用到了索引,且where子句中涉及的字段满足联合索引的最左前缀匹配原则,即出现了覆盖索引,不需要通过索引得到的主键值回表查询数据。
4.using where:单独出现时,表示where子句中的所有字段都与索引无关;表示where子句中只有部分字段使用了索引;表示where子句中的字段都是联合索引中的一部分,但是不满足最左前缀匹配原则,所以无法使用联合索引。
5.using where、using index:一起出现时,表示select子句的字段都使用到了索引,而where子句中的字段都是联合索引的一部分,但是不包括最左列,无法使用联合索引,需要回表查询数据以后使用where条件过滤;表示select子句的字段都使用到了索引,而where子句中也有联合索引的最左列,但对最左列使用了范围查询,虽然直接在索引层面过滤了数据而不是回表查询后再用where过滤,但也导致联合索引接下来的部分失效。
6.using join buffer:多表连接查询时,如果涉及到的表太多,就会使用连接缓存,可以修改配置文件中的参数来增大缓冲区。
7.null:被查询的列没有被索引覆盖,但where条件是索引的前导列,此时用到了索引,但是部分列未被索引覆盖,必须通过“回表查询”来实现,不是纯粹地用到了索引,也不是完全没用到索引
8.impossible where:where子句中条件的值为false,无法获取需要的数据
9.using index condition:表示使用了索引下推技术


二。索引下推技术–ICP

ICP(index condition pushdown)是MySQL利用二级索引的元组和where中的筛选字段在索引中的WHERE条件从表中提取数据记录的一种优化操作。ICP的思想是:存储引擎在访问索引的时候检查筛选字段在索引中的WHERE条件(pushed index condition,推送的索引条件),如果索引中保存的数据不满足推送的索引条件,那么就过滤掉该条数据记录。ICP(优化器)尽可能的把index condition的处理从Server层下推到存储引擎层。存储引擎使用索引过过滤不相关的数据,仅返回符合Index Condition条件的数据给Server层。也是说数据过滤尽可能在存储引擎层进行,而不是返回所有数据给Server层,存储引擎尽可能的过滤数据后再回表根据WHERE条件进行过滤。

三。关于ICP的一些注意事项

1.当关闭ICP时,无法直接通过索引直接获得的数据都得回表查询以后在用where条件过滤,比如说联合索引缺少了中间字段,导致无法依次匹配。
2.开启ICP后,比如有联合索引(A,B,C),只使用了A、C,此时不会回表去查匹配C的数据,而是筛选出满足A的索引数据以后,继续在其中筛选匹配C的索引,然后将匹配A、C条件的索引返回给server层,这样就避免了全表扫描。
3.ICP用于二级索引,不能用于主键索引
4.如果where子句中有字段不在联合索引中,那么这些字段无法通过ICP直接得到数据,还是需要回表全表扫描以后再用where条件过滤
5.使用覆盖索引时,也就不需要ICP技术了,因为可以通过索引直接得到所有数据,不存在回表的可能性,ICP是需要回表查的时候,尽量减少回表的次数。
6.只支持InnoDB和MyISAM存储引擎

猜你喜欢

转载自blog.csdn.net/qq_44727091/article/details/112071539