目录
前置基础
关于索引的基础内容,已经在前置文章中写过,如若没有读过前篇文章并且数据库索引这一块没怎么了解过的,链接在这数据库技术深化_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树,由于分支节点不存储数据,将能够存储索引更大的数据量.
缺点:
- 插入速度将会非常严重地依赖于插入的顺序,批量插入的时候,如果每一个插入的数据是按主键或者索引字段排序的,那么插入速度将会很快,反之就会很慢,甚至有的时候出现页分裂.
- 更新主键代价高昂,需要移动存储位置.//这个缺点我们一般忽略,本身去更改主键就很扯(如果用的主键索引的话),但是换一个说法,更改索引字段代价很高昂.
下一篇讲聚簇和非聚簇吧,撑不住了!散会!