(七十一)大白话再次重温写出各种SQL语句的时候,会用什么执行计划?(2)

今天我们来看一个比较奇特的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语句的时候,有可能是会同时查多个索引树取个交集,再回表到聚簇索引的,这个可能性是有的。大家只要记住这个结论就行了,后续在分析真实执行计划的时候,我们会再提到这个。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值