索引-加快表连接速度

表连接的3种算法,分别是:hash,nested loop,merge 这⾥主要讲hash

现在有A、B两个表,A表数据量1000w,B表数据2000w,关联字段是ID。

对hash算法的影响

(1)⽆其他过滤条件,select A.*,B.*

hash算法实现两个表join时,如果关联的条件只是 ID字段,那么在关联时,遍历数据的次数=1000w+2000w=3000w。

那么就算给这2个表,分别创建索引,也不会加快连接的速度。

(2)⽆其他过滤条件,但是select A.ID,B.ID

在这个前提下,如果创建索引,会加快连接速度。

因为这个时候虽然需要访问表⾥所有的数据,但是可以直接⽤索引的数据,进⾏关联,因为只需要返回两个表的ID字段的值。

⽽相对于表来说,索引中只包含了ID字段的值,所以占⽤的磁盘空间,相对于表来说,会⼩很多,所以扫描整个索引所需要的时间,远⼩于扫描全表的时间,本质上就是访问的数据页数少了,IO次数少了,所需要的时间就少了。

(3)有其他过滤条件,且最后只返回少量数据

这种情况下,由于只返回少量数据,索引的作⽤才正在显现,因为索引的适⽤场景,就是返回少量的数据,⽐如:

select A.*,B.*

FROM A  JOIN B ON A.ID = B.ID

WHERE A.ID = 12345678

只返回10条数据,那么整个执⾏过程就是,先⽤过滤条件 A.ID = 12345678 在A的索引种查找符合要求的数据,从1000w条数据中,过滤出10条数据(ID不⼀定是主键)。

然后,这⾥sql server应该会做⼀个谓词的推导:

A.ID = 12345678,然后

A.ID =B.ID,所以 B.ID = 12345678。

于是直接在B表的索引种查找 12345678,可能是1条,最后关联⼀下就是10条数据。

那么,如果这⾥sql server不做这个谓词的推导,结果⼜会如何呢?

只能是,对于已经找到的10条数据,通过访问B表索引的数据,进⾏探查,总共遍历次数= 10 + 2000w=2010w,速度也不会快到哪⼉去。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值