(1)回顾:
一般一个SQL语句只能用到一个二级索引,但是有一些特殊情况,可能会对一个SQL语句用到多个二级索引,比如:select * from table where x1=xx and x2=xx 然后x1和x2两个字段分别都有一个索引,其实也有一定的可能会让查询优化器生成一个执行计划,执行计划里,就先对x1字段的索引树进行查找,查出一批数据,接着对x2的索引树查出一批数据,然后对两批数据,按主键值做一个交集。
这个交集就是符合两个条件的数据,接着回表到聚簇索引去查完整数据就可以了。但是之前我们对这种情况一直说的是,选择x1或者x2其中一个字段的索引,就查一个字段的索引,找出一批数据,接着直接回表到聚簇索引查完整数据,然后根据另一个字段的值进行过滤。
那么到底什么情况下,会直接对两个字段的索引一起查,然后取交集再回表到聚簇索引呢?也就是什么情况下可能会对一个SQL执行的时候,一下子查多个索引树呢?
注意存在先根据一个索引回表查询出一批数据然后根据另一个字段索引进行过滤,也存在根据一个索引查询出一批数据同时会根据另一个索引查出一批数据进行取交集,最终取出数据;
(2)查询效率:
假设就上面那个SQL,比如x1和x2两个字段,如果先查x1字段的索引,一下子弄出来上万条数据,这上万条数据都回表到聚簇索引查完整数据,再根据x2来过滤,这样效果不好,如果同时从x2的索引树里也查一批数据出来,做一个交集,一下子可以让交集的数据量变几十条,再回表查询速度就很快了。一般来说,查索引树速度都很快,但是到聚簇索引回表查询会慢一些。
所以如果同时查两个索引取一个交集后,数据量很小,然后再回表到聚簇索引里查,此时会提升性能。但是如果要在一个SQL里用多个索引,那有很多硬性条件的要求,比如说如果有联合索引,必须把联合索引里每个字段都放SQL里,而且都是等值匹配;或者通过主键查询+其他二级索引等值匹配,也可能会做一个多索引查询和交集。
(3)总结:
只要记住,在执行SQL语句时,有可能会同时查多个索引树取个交集,再回表到聚簇索引的,这个可能性时有的。
(4)多个索引查询:
可能一个SQL里用多个索引,可能对多个索引树进行查找,接着用intersection交集,union交集的方式来进行合并,此时可能在执行计划里也会看到这些字样,那起码这里知道怎么回事。