数据库索引深化

目录

前置基础

索引存储结构 

hash索引

B树索引

B+树索引


前置基础

关于索引的基础内容,已经在前置文章中写过,如若没有读过前篇文章并且数据库索引这一块没怎么了解过的,链接在这数据库技术深化_Scott McGough的博客-CSDN博客

索引存储结构 

索引的存储结构主要有hash(哈希)索引,B树索引,B+树索引.

任何能够链接数据的结构或者方式的组合都可以称之为索引,索引归根结底只是一种数据结构或多种数据结构的组合.

hash索引

通过hash散列函数实现的一种索引.

每个索引存储着一个key值,通过对key值的一次hash计算即可直接计算出数据存储位置,进而得到数据,基本上一次检索就可以找到数据,而 B+ 树需要自顶向下依次查找,多次访问节点才能找到数据,中间需要多次 I/O 操作,从效率来说 Hash 比 B+ 树更快。因此很多时候(精确查找),hash索引比B树,B+树都更加高效.

hash索引的查找步骤:

 

通过输入的一个key值进行hash函数计算,映射到某个桶(bucket),桶中存储着多条数据(这些数据有某些共同特点,比如id都以1开头,或者除以2的余数都是1等等,具体以什么形式分门别类看数据库的hash算法,以什么分门别类,取决于以哪些列建立索引),以链表的形式存储.映射到桶之后,在桶里进行查找.

 hash索引在目前大多数关系型数据库中已经应用不多,主要是由于以下缺点:

  • 查询性能受hash冲突率影响,性能不稳定
  • 只能通过等值匹配的方式查询,不能范围查询
  • 结构存储上没有顺序,查询时排序无法支持

因此在数据库软件应用场景日益复杂的今天,简单的hash表已经很难满足关系型数据库的基础查询功。 

所谓hash冲突就是不同的key值通过hash算法计算,拥有相同的值,也就是在同一个桶里,如果hash冲突多就会导致,桶中的数据量很大, 查找效率变低.

经过对hash查找步骤的了解,应该知道,hash存储是散列式的,他们之间只有hash算法计算出的值是同一个这一个相同点,根据这个将他们放在同一个桶里,因此数据存储之间没有值的大小顺序,无法进行范围的查找!

也正因为存储上没有数值大小顺序,查询的时候就会无法排序.

综上hash索引应用越来越少了!

B树索引

是基于二叉树的索引

 如图,其实就是简单的一颗分支树而已.多少到多少的走左边,多少到多少的走右边,因此需要多次比较,多次访问节点.是一种查询效率比较低的存储方式,但是肯定比遍历高.其次支持范围查找.其次图中没有体现出来的是,B树的分支节点除了存储键值与指针外,还存储表记录中除主键外的数据.也就是说最左边那条分支的B1中,就存储了id为1和id为50的数据的内容.

B+树索引

 当前关系型数据库中应用最广泛的索引结构,主要是相比于hash索引,支持范围查找,性能稳定,支持排序,这些特点B树都有,那么为什么还要用B树,既然名称叫B+树肯定是因为做了改良.

相比于B树,B+树的分支节点是不存储数据的,也就是说非叶子节点中存放数据项索引,只存放

键值与页号,数据的内容统统在叶子节点.

相对于B树优点:

  • B+树对于主键(排序键)的排序查找和范围查找速度非常快,因为链表的数据结构。B树就没有,没有链表双向指针,范围查找的速度就比较慢.
  • 按照B+树排列顺序,查询显示一定范围数据的时候,由于数据都是紧密相连,数据库不用从多个数据块中提取数据,所以节省了大量的io操作。
  • 相对于b树,由于分支节点不存储数据,将能够存储索引更大的数据量.

 缺点:

  • 插入速度将会非常严重地依赖于插入的顺序,批量插入的时候,如果每一个插入的数据是按主键或者索引字段排序的,那么插入速度将会很快,反之就会很慢,甚至有的时候出现页分裂.
  • 更新主键代价高昂,需要移动存储位置.//这个缺点我们一般忽略,本身去更改主键就很扯(如果用的主键索引的话),但是换一个说法,更改索引字段代价很高昂.

 

 下一篇讲聚簇和非聚簇吧,撑不住了!散会!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值