深入理解数据库索引采用B树和B+树的原因

  要想了解这个问题,首先必须需要对数据库的存储有一定的了解。数据库文件存储的方式、从数据库读取数据的原理、减少磁盘IO操作的影响因素。

1 数据库文件存储的方式

  数据库文件存储都是以磁盘文件存储在系统中的,这也是数据库能持久化存储数据的原因。

2 从数据库读取数据的原理

  从数据库读取数据,先暂且不考虑从缓存中读取数据的情况,那就是从磁盘文件中读取数据的,我们知道从磁盘文件中读取数据是比较耗时的,数据库的select操作的时间,取决于执行磁盘IO的次数,因此尽量减少磁盘IO就可以显著的提升数据的查询速度。

3 减少磁盘IO操作的影响因素

  有哪些因素可以减少磁盘IO呢,这首先得将了解一下磁盘IO与预读。

3.1 磁盘IO与预读

  磁盘读取依靠的是机械运动,分为寻道时间、旋转延迟、传输时间三个部分,这三个部分耗时相加就是一次磁盘IO的时间,大概9ms左右。这个成本是访问内存的十万倍左右;正是由于磁盘IO是非常昂贵的操作,所以计算机操作系统对此做了优化:预读;每一次IO时,不仅仅把当前磁盘地址的数据加载到内存,同时也把相邻数据也加载到内存缓冲区中。因为局部预读原理说明:当访问一个地址数据的时候,与其相邻的数据很快也会被访问到。每次磁盘IO读取的数据我们称之为一页(page)。一页的大小与操作系统有关,一般为4k或者8k。这也就意味着读取一页内数据的时候,实际上发生了一次磁盘IO。
  正因为有了磁盘IO预读机制,所以才有了减少磁盘IO的可能,因为一次磁盘IO操作,可以查找到物理存储中相邻的一大片数据。

  综述所述,为了减少性能消耗,数据库索引采用的结构需要尽可能的减少磁盘IO操作。首先我们来了解一下什么是索引、索引有什么作用。

1 什么是索引

  索引是帮助数据高效查询数据的一种数据结构,它包含一个表中某些列的值以及记录对应的地址,并且把这些值存储在一个数据结构中。常用的索引有B树和B+树。

2 索引有什么作用

  打个比方,比如我们查询select * from user where username=‘xiaoming’;如果没有索引的是不是需要全表扫描。然而,当我们添加索引之后,只需根据’xiaoming’这个关键字来找到对应的映射(也就是找到对应的地址)。

3 数据库中使用什么作为索引

3.1 链表

  链表的查询速度是O(n),每次查询都要从链表头开始查询,如何索引值在最末尾,那全部都访问了,是不是磁盘IO次数为n,非常耗性能。

3.2 数据

  数据的查询速度最快,但是采用数组会遇到如下几个问题:1、采用数组的话,其他操作如Delete、Update、Insert就不合适了;2、另外一个原因:索引是存在于磁盘中,当索引非常大的时候,达到几个G的时候,无法一次加载到内存中。

3.3 平衡二叉树

  平衡二叉树的时间复杂度为O(logN),查询速度最快(数据除外,数据局限性,不能做比较)且比较次数较少。然而,数据库索引不用平衡二叉树。就在于B树结构,减少了磁盘IO的预读次数。

3.4 平衡二叉树与B数查询对比

  我看一一篇博文关于其内容的,讲的非常好,值得推荐

总结

  数据库索引采用B树和B+树,就是从最少磁盘IO的角度来出发的。如果想了解一下B树与B+树的区别,请看B树与B+树理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值