89、再次重新写出各种SQL语句的是,会用什么执行计划?(二)
00 分钟
2022-8-26

89、再次重新写出各种SQL语句的是,会用什么执行计划?(二)

今天我们来看一个比较奇特的SQL语句以及特殊的执行计划,之前我们都是说,一般一个SQL语句只能用到一个二级索引,但是有一些特殊的情况下,可能会对一个SQL语句用到多个二级索引,这是怎么回事呢?
比如有这么一个SQL:select * from table where x1=xx and x2=xx,然后x1和x2两个字段分别都有一个索引,其实也有一定的可能会让查询优化器生成一个执行计划,执行计划里,就先对x1字段的索引树进行查找,查出一波数据,接着对x2的索引树查出一波数据,然后对两波数据,按照主键值做一个交集。
这个交集就是符合两个条件的数据了,接着回表到聚簇索引去查完整数据就可以了
但是其实之前我们对这种情况一直说的是,选择x1或x2其中一个字段的索引,就查一个字段的索引找出一波数据,接着直接回表到聚簇索引查完整数据,然后根据另外一个字段的值进行过滤就可以了
那么到底什么情况下,会直接对两个字段的两个索引一起查,然后去交集再回表到聚簇索引呢?也就是什么情况下可能会对一个SQL执行的时候,一下子查多个索引树呢?其实很简单,大家可以思考一下。
假设就上面那个SQL语句吧,比如你x1和x2两个字段,如果你先查x1的索引,一下子弄出来上万条数据,这上万条数据都回表到聚簇索引查完整数据,再根据x2来过滤,你有没有觉得效果不是太好?
那如果说同时从x2的索引树里也查一波数据出来,做一个交集,一下子就可以让交集的数据量变成几十条,再回表查询速度就很快了。一般来说,查索引树速度都比较快,但是到聚簇索引回表查询会慢一些。
所以如果同时差两个索引树取一个交集后,数据量很小,然后再回表到聚簇索引去查,此时会提升性能。
但是如果要在一个SQL里用多个索引,那有很多硬性条件的要求,比如说如果有联合索引,你必须把联合索引里每个字段都放SQL里,而且必须都是等值匹配;或者是通过主键查询+其他二级索引等值匹配,也有可能会做一个多索引查询和交集。
其实大家看这个可能看的很迷惑,但是不用迷惑,其实你只要记住,在执行SQL语句的时候,有可能是会同时查多个索引树取个交集,再回表到聚簇索引的,这个可能性是有的。大家只要记住这个结论就行了,后续在分析真实执行计划的时候,我们会再提到这个。

评论