您的位置:首页 > 理论基础 > 数据结构算法

对数据库索引的数据结构学习

2015-12-21 20:21 302 查看
我前段时间一直在使用Oracle数据库,发现建立索引对查询速度的提升是很大的,就对这个比较好奇,把学习到的知识归列如下。

以Mysql为例,它的索引就是采用B树和B+树这种数据结构来实现的。

B树,是一种使用文件存储时常用的数据结构结构,它是二叉查找树的升级版——可以有多个分叉。因为在这种需要机械磁盘与主存交换数据的场景下,最耗费时间的其实是磁盘读取次数,也就是读写磁头要转到磁道上正确位置这种物理动作所花费的时间是远大于数据的传输的。以7200转每分钟的常见机械硬盘为例,转完整的一拳需要8.33毫秒,这比以硅为存储介质的主存差不多慢了五个数量级,后者只需要100纳秒,0.0001毫秒。

所以,如何减少磁盘读取次数就成了关键,而B树的多叉结构可以让足够多的数据一次性换入主存。一棵分支因子为1000、高度为2的B树可以存储超过10亿个关键字,寻找某一关键字只需要两次磁盘存取。而存储同样多的关键字,2^30-1 > 十亿,一棵二叉查找树的高度会是30,最多可能需要30次查询才能找到该关键字。



下面是算法导论中的一些结论,直接抄过来记结论就好了。

一棵每个节点最少包含t的结点,总关键字数为N的B树的高度



B树的查找所需磁盘存储次数为O(logtN)



B树的插入所需存储次数为O(t*logtN)



满结点分裂

因为一棵B树的最小度数 t 决定了每个结点内包含的最大关键字数不能超过2t -1 ,因此B树在插入过程中会产生满结点的分裂,即新加入的关键字所在结点是满的,那么会把满结点中间的一个关键字提出来,插入父结点,若父结点也是满的,那么沿父结点向上寻找直到找到一个不满的结点。



这种情况下,B+树为什么优于B树

B+树就是内节点不存储数据,只存储关键字,叶子节点不存储指针的B树。

除了根结点常驻主存外,每个结点的读/写都需要一次DISK-READ/WRITE。

上面说过,B树的查找所需磁盘存储次数是 logtN (t 是最小度数, N 是总关键字数),N是常数,这表示 t 越小,索引效率越高。

而有一个公式来确定t的最大值 tmax=floor (pagesize/(keysize+datasize+pointsize))

floor表示向下取整。在页大小(主存)一定的情况下,关键字、数据越小,t 就能越大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: