我们为什么要用索引,用索引为什么比不用索引快

今天分析客户的oracle数据库,发现很多表上都建立了复合索引,而SQL的执行计划很多都没有走索引或者都是索引扫,这显然是不对的,通过分析SQL发现,SQL的条件很多都不满足复合索引,也可以说是复合索引简历的不正确,在请教老杨(杨廷琨)之后,使我明白了很久以来一直没有关注过也没仔细思考过的问题,就是我们为什么要用索引,都说用索引会加快数据库的速度,那么为什么会加快速度呢?我想这个问题很多人都会回答因为索引记录了表中的ROWID,所以快,那么在有些情况下,索引的大小甚至比表还大,全扫索引还不如全扫表呢!

      经过老杨的细心指点,我才真正的明白、理解、记住(以前曾看过索引的资料,时间长都忘啦)。

      老杨问我如果一张表上没有索引,你要查ID=5的记录,数据库会怎么做?

      我说数据库会先根据数据字典找到这张表,然后根据表头的记录找到这张表的数据块,然后每个数据块去找。

      老杨:会把所有的数据块都扫一遍吗?
      我:有可能会,有可能不会。(我回答错啦)

      老杨:那么什么时候会全扫?什么时候不全扫?

      我:有可能扫第一个块的时候就找到了ID=5的行,就不去扫其他的块啦,也有可能扫到最后的一个块才找到D=5的信息,就全扫啦。

      老杨:可能是我问你的问题误导你了,我一说ID=5你就以为ID是主键,那么如果找的不是ID=5而是name=张三的呢?

      我:那样会全扫。

      老杨:为什么会全扫,可能在找第一个快的时候就找到了name=张三的信息啦。

      我:因为name=张三的行有很多重复的。

      老杨:这就对啦,如果不用索引,即使是找一条数据库里没有的数据,oracle也会把表的所有块都扫一遍,然后返回结果,索引记录了行的信息,所以有时候我们要用索引。那么用索引为什么会提高性能呢?

      老杨:因为索引(以B树索引为例)是树状结构,最上面的是根,根下面是枝,枝再下面是叶,根会记录比如1-20的ID在第一个枝上,21-40在第二个枝上... ... ,这样我们找ID=5的数据,走索引的话,通过扫描根就直接去找第一个枝,通过扫描第一个枝找到所有ID=5的行的ROWID找到所有ID=5的数据。而且,索引是有序的(这也是有些时候索引会比表大的一个原因),这样就提高了效率。

       以上不是原话,原话记不清啦,是我理解的大概意思!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值