数据库索引总结

1、磁盘

1.1:磁盘结构:磁盘臂组件,磁盘片,磁盘片中一个圆环是一个磁道,磁道分成许多扇区,扇区是存储的基本单位。

1.2:磁盘读写:寻道,也就是磁盘臂左右转动到需要的磁道,磁盘片转动到合适的扇区

1.3:扇区和块(页):操作系统为了减少读写次数,将许多扇区组成一起进行读写,叫做块,块不能太小(读写次数多),也不能太大(浪费空间),现代操作系统一般为4K。

2、文件组织

文件组织:数据库被映射到不同的文件,这些文件在逻辑上组织成为记录的序列,这里面有两个问题,一个是记录的结构,分为定长和变长,一个是这些记录的组织方式,

2.1 记录结构:

2.1.1定长记录结构:每个块中容纳最大的记录量(向下取整),避免一个记录坐落在两个数据块,从而需要读取两次。另外关于插入和删除,为了提高效率,减少记录的移动,我们采取指针的方式将记录串联起来。并且需要一个头文件(头文件里面数据是元文件,也就是数据的数据,比如关系的名字,属性的名字,属性域和长度等),头文件里面放第一个出现空闲位置的指针,第一个空闲位置放第二个空闲位置的指针,以此类推,从而组成空闲列表。插入的时候根据列表找位置。当然插入还是删除,都要根据文件组织方式。这里提插入删除没任何意义。

2.1.2:变长记录结构:

2.2 组织方式:

2.2.1:堆组织:也就是哪里有空隙就放在哪里,记录没顺序   

2.2.2:顺序文件组织:记录根据搜索码的值顺序存储。文件头维护一个空闲列表头指针。删除的时候,将位置加入到空闲列表中。插入的时候,先查找上一个记录的位置,如果上一个记录所在的块中有位置(在空闲列表中查找)那么将数据放到里面,并且更新列表中的指针。如果没有的话,就要插入到溢出块中(插入到一个新的没有记录的块,而不是在空闲列表中找,因为空闲列表中的位置可以供之后的插入的记录用)。这两种情况都要调整记录指针,使他们连在一起。但是注意,之前的文件中的记录在硬盘中是顺序放的,这样放的好处是减少寻道时间,提高效率。但是放到溢出块中后记录的物理顺序就不一样了,对于顺序处理文件的应用非常不友好,可以通过重组来实现之前的效率。因为定长的记录长度一样长,所以插入的时候,不容考虑记录的大小


2.2.3:散列文件组织:散列函数决定了记录放到哪个块

3、索引

索引就是为了提高查询,更新数据库的效率的,避免查询一条记录,从而无序没有目的的读取大量记录,从而浪费时间。然而索引也有坏处,数据量很大,那么索引就很多,会占一定的硬盘空间和内存,另外更不好的是,我们也需要去维持这个索引的更新。索引主要有顺序索引,以及散列索引。

3.1:顺序索引:由搜索码和指向记录的指针组成。搜索码按照顺序存储,这里有两个概念叫做聚集和非聚集,这两个是针对记录的物理存储顺序而言。聚集就是记录的物理顺序也是按顺序存储的,非聚集相反。前者和顺序索引组合叫做聚集索引,也叫做主索引(数据块会默认在主码上面创建这个索引),后者叫非聚集索引也叫做辅助索引。一个数据库只能有一个聚集索引,但是可以有多个非聚集索引。

3.1.1:稠密索引和稀疏索引,前者是关系中的搜索码在索引结构中都以一个对应的位置(对于聚集索引搜索码相同的不同记录,依次放到搜索码的指向的第一条记录后面非聚集索引必须都要存储)。稀疏索引中,只为搜索码的某些指建立索引项,所以只能在聚集索引才可以这样(无论是指针串起来还是物理顺序就是这样的,当然最好是物理顺序就是这样的)。可以为每一个块中取最后一条记录的搜索码作为索引值,假设查找某条记录,此记录的搜索码为v,索引中的搜索码 为Ki(i=0,1,2......),那么可以根据二分查找找到Kj,使得j是最小的i的取值,使得ki>=v,从而在这个块中再去查找此记录,这样虽然没有稠密索引块(因为需要两次查找),但是节省空间,这两个也是时空权衡。如果数据量非常大,索引数量很大,而且大到不能放在内存中,可以在内层索引上面建一层稀疏索引。这样子,可以准确迅速定位内层索引的位置,从而更快提取记录。

总结:索引顺序文件组织最大的缺点在于,随着文件的增长,索引的查找性能越来越不好(log2N),而且如果数据放到溢出块中,对于顺序处理文件的程序不是很友好,并且对于稀疏索引来说,每次读一个块,发现数据不在此块中,那么还要在通过记录之间的索引再次读取一个块,从此块中去查找。

3.1.2:b+树。b+树在删除和插入上面的性能比顺序索引差,但是查询很快。另外b+树的数据结构增加了空间开销(一个大的节点可能是半空的)。b+树是平衡的(从根节点到任意叶节点的路径长度一样),对于查询插入删除操作来说最多是log(n/2)N,其中n对于一个树是确定的(节点中是指针,搜索码来回循环以指针结束,n就是指针的总数,下面本节所有的n都是这个值),一个非叶子节点的孩子数在(n/2~n)之间,b+树一般节点的大小为块的大小,这样每一层的节点总数最大为n^h-1,数据量可以存很大。所以又胖又矮,查询的时间很少。

典型的b+树节点,由搜索码以及指针组成,节点中pi,ki连续最后由指针域结尾,如上图所示。其中非叶子节点和叶子节点又不一样。对于叶子节点来说,指针是对于pi(i=1,2,3,4,5,n-1,n节点中指针的数量),指向的是记录的位置,pn指向下一个叶节点的位置,这样在叶节点中,所有的搜索码都是存在的,并且按序排好的。这样可以高效顺序处理记录。对于非叶子节点,形成叶节点的多级稀疏索引,其中节点域也叫做扇出,pi(i=2,3,4,n-1)指向的区域值范围x,ki-1<=x<ki,p1小于k2,pn大于等于kn-1。对于非叶子节点,容纳的指针最多为n,最少为n/2。根节点可以少于n/2,但是最少要含有两个指针。

对于B+树的查询,ki为节点中的值,v为搜索码,找到最小的>=v的ki,如果为空,就到pn指向的区域中,否则,如果相等,就去pi+1指向的区域,ki>v就去Pi指向的区域。如果搜索码中有重复的值,为了找到所有的记录,需要找到最左边的记录。一直往下遍历到叶子节点。删除和插入,比较麻烦,主要涉及到节点满了要拆分,而且叶子节点拆了,非叶子节点也要拆,还要同时保证平衡这个特点

总结:b+树解决了随着记录增多,顺序索引不好更新的特点,以及查询时间变短。但是对于记录的插入删除依旧会破坏记录的物理顺序,将文件顺序组织,变成b+树组织可以解决这个问题。

3.1.3 b树:b+树有的搜索码会冗余,b树不会,b树叶子节点和b+树是一样的,但是非叶子节点中除了存储和b+树一样的指针外,还会存储指向记录的指针。因为这样b树的扇出比较小,比b+树深度大。虽然搜索一个记录b+树需要从根节点到叶子节点,而b树是不需要的,但是b树叶子节点存的搜索码比非叶子节点多很多,所以对于找一个特定的值来说,大概率是存在叶子节点上的。还有一点是,b+树可以范围查找,这是b树没有的

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值