柠檬少年|腾讯面试官用「B+树」虐哭我了
作者 | L的存在
来源 | 我是程序员小贱(ID:Lanj1995Q)
我们知道当系统要处理的数据量非常庞大的时候 , 数据不可能全部存放于内存 , 需要借助磁盘来完成存储和检索 。 在数据库中支持很多种索引方式 , 常见有哈希索引、全文索引和B+树索引 。 今天将和大家分享使用B+树作为索引的优缺点 。
面试很多互联网公司 , 都会问这个问题 , 也许我们看过太多面经内容 , 但是基本上答案千篇一律 , 对于面试官而言也是基本上听腻了 , 是多么希望能听到不一样的解答 , 那么今天希望这篇文章可以给你不一样的答案 。
今天分享的几点如下:
目录
数据从磁盘读写与内存读写有哪些不同我们平时接触的有机械硬盘和固态硬盘 。 内存属于半导体器件 , 对于内存 , 我们知道内存地址就可以通过地址拿到数据 , 也就是内存的随机访问特性 。 访问速度快但是贵 , 所以内存空间一般比较小 。
对于磁盘 , 属于机械器件 。 每当磁盘访问数据的时候 , 都需要等磁盘盘片旋转到磁头 , 才能读取相应的数据 , 即使磁盘的转速很快 , 但是和内存的随机访问相比还是渣渣 。
所见 , 如果是随机读写 , 其性能差距是非常大的 。 那如果是顺序访问大量数据的时候 , 磁盘的性能和内存其实差距就不大了 , 这是为啥?
磁盘的最小读写单位是扇区 , 现在磁盘扇区一般是4k个字节 , 对于操作系统 , 一次性会读取多个扇区 , 至此操作系统的最小读取单位就是块 。
每当我们从磁盘读取一个数据 , 操作系统就会一次性读取整个块 , 那么对于大量的顺序读写来说 , 磁盘效率会比随机读写高很多 。
假设现在你有个有序数组 , 全部以块的方式存放在磁盘中 , 现在我们通过二分查找的方式查找元素A 。 首先我们找到中间元素 , 并从块中取出 , 将其从磁盘放入内存中 , 然后再内存中进行二分查找 。
在进行下一步的时候 , 如果查找的元素在其他块中 , 我们需要继续从磁盘读出到内存中 。 这样反反复复的从磁盘到内存 , 其效率将非常的低 。 所以我们需要想办法让访问磁盘的次数尽可能的低 。
数据和索引分离我们以公安系统为例 。 系统中的用户非常多 , 每个用户除了姓名 , 年龄等基本信息外 , 当然还有一个唯一标识的ID , 我们拿到这个ID , 就可以知道对应的基本信息 。 但是每个用户的基本信息太多不可能全部存放在内存中 , 因此考虑存储于磁盘中 。
用户数据
- 采用有序数组的方式 , 其中分别存储用户ID和用户信息所在磁盘的位置 , 这样我只需要存放两个元素 , 直接存放于内存 。 如下图所示
但是在数据频繁变化的场景中 , 有序数组的弊端就出现了 。 大部分情况还是考虑使用二叉检索树或者哈希表的方式 。 但是哈希表又不支持区间查询 , 因此更多的使用二叉检索树的方式 。 如下图所示:
推荐阅读
- 彭坦|他曾是乐队主唱颜值天花板,娶名模12年0绯闻,42岁仍是少年
- 鲜闻联播|二话不说!拔剑指向酒馆老板,笑话:少年只身来到一家酒馆
- 战斗机,军事|这张迟来的“全家福”,14岁少年等了14年!
- [影视]腾讯影业、新丽传媒、阅文影视联合发布56个项目
- 暖夏少年|韩国5G陷入绝境,三星暗示华为才能拯救,最早布局最早弃用
- 腾讯时尚|今年的毛衣,选纯色就对了!But…
- 盛锐游戏视野于婷|一别71年后重回故土,母子白发相见,15岁少年瞒着母亲偷偷参军
- 文娱商业观察《热血满满的弟弟们》燃爆收官,腾讯微视内容生态跃进
- 腾讯科技OPPO发布Enco X真无线耳机:丹拿调音支持主动降噪,售价999元
- 左手时尚右手家庭|也不是华为,而是每天赚10亿的它,深圳最“赚钱”公司!不是腾讯
