加入收藏 | 设为首页 | 会员中心 | 我要投稿 鹤壁站长网 (https://www.0392zz.cn/)- 分布式云、存储数据、视频终端、媒体处理、内容创作!
当前位置: 首页 > 站长资讯 > 传媒 > 正文

5G究竟有多快?

发布时间:2021-02-07 14:38:32 所属栏目:传媒 来源:互联网
导读:举个例子,在b树中查询数据的情况: 假如我们查询值等于10的数据。查询路径磁盘块1-磁盘块2-磁盘块5。 第一次磁盘IO:将磁盘块1加载到内存中,在内存中从头遍历比较,1015,走左路,到磁盘寻址磁盘块2。 第二次磁盘IO:将磁盘块2加载到内存中,在内存中从头

举个例子,在b树中查询数据的情况:

假如我们查询值等于10的数据。查询路径磁盘块1->磁盘块2->磁盘块5。

第一次磁盘IO:将磁盘块1加载到内存中,在内存中从头遍历比较,10<15,走左路,到磁盘寻址磁盘块2。

第二次磁盘IO:将磁盘块2加载到内存中,在内存中从头遍历比较,7<10,到磁盘中寻址定位到磁盘块5。

第三次磁盘IO:将磁盘块5加载到内存中,在内存中从头遍历比较,10=10,找到10,取出data,如果data存储的行记录,取出data,查询结束。如果存储的是磁盘地址,还需要根据磁盘地址到磁盘中取出数据,查询终止。

相比二叉平衡查找树,在整个查找过程中,虽然数据的比较次数并没有明显减少,但是磁盘IO次数会大大减少。同时,由于我们的比较是在内存中进行的,比较的耗时可以忽略不计。B树的高度一般2至3层就能满足大部分的应用场景,所以使用B树构建索引可以很好的提升查询的效率。

过程如图:
 

就这个特点来看,可能各位会觉得这就很好,可以达到二叉树的理想的情况了。然而依然存在一些问题:

  1. 时间复杂度和树高相关。树有多高就需要检索多少次,每个节点的读取,都对应一次磁盘 IO 操作。树的高度就等于每次查询数据时磁盘 IO 操作的次数。磁盘每次寻道时间为10ms,在表数据量大时,查询性能就会很差。(1百万的数据量,log2n约等于20次磁盘IO,时间20*10=0.2s)
  2. 平衡二叉树不支持范围查询快速查找,范围查询时需要从根节点多次遍历,查询效率不高。

B树:改造二叉树
MySQL的数据是存储在磁盘文件中的,查询处理数据时,需要先把磁盘中的数据加载到内存中,磁盘IO 操作非常耗时,所以我们优化的重点就是尽量减少磁盘 IO 操作。访问二叉树的每个节点就会发生一次IO,如果想要减少磁盘IO操作,就需要尽量降低树的高度。那如何降低树的高度呢?

假如key为bigint=8字节,每个节点有两个指针,每个指针为4个字节,一个节点占用的空间16个字节(8+4*2=16)。

因为在MySQL的InnoDB存储引擎一次IO会读取的一页(默认一页16K)的数据量,而二叉树一次IO有效数据量只有16字节,空间利用率极低。为了最大化利用一次IO空间,一个简单的想法是在每个节点存储多个元素,在每个节点尽可能多的存储数据。每个节点可以存储1000个索引(16k/16=1000),这样就将二叉树改造成了多叉树,通过增加树的叉树,将树从高瘦变为矮胖。构建1百万条数据,树的高度只需要2层就可以(1000*1000=1百万),也就是说只需要2次磁盘IO就可以查询到数据。磁盘IO次数变少了,查询数据的效率也就提高了。

这种数据结构我们称为B树,B树是一种多叉平衡查找树,如下图主要特点:

  1. B树的节点中存储着多个元素,每个内节点有多个分叉。
  2. 节点中的元素包含键值和数据,节点中的键值从大到小排列。也就是说,在所有的节点都储存数据。
  3. 父节点当中的元素不会出现在子节点中。
  4. 所有的叶子结点都位于同一层,叶节点具有相同的深度,叶节点之间没有指针连接

很多读者小伙伴可能感觉我写的比较容易。不过, 说实话,我中间写的过程中也遇到了很多问题。为了解决写这个框架遇到的一些问题,我熬了很多夜,也早起了很多次。

我不算是奋青。一般情况下,我平时都是晚上 9 点半之后玩几把王者荣耀,到了 12 点左右就睡觉了。早晨的话,我一般都是 8 点左右起床。几乎日日如此。

但是,写这个 HTTP 框架的时候,我记得有 3 次我熬夜到凌晨 2 点左右。有 2 个早晨,因为有“灵感”,我 5 点多久爬起来写代码了。

说这些,不是为了博同情让大家觉得我写的多辛苦,也不是表现我有多努力。

这些都是很平常的经历罢了!我觉得大部分程序员都经历过:

  • 夜深人静的时候,突然自己写的代码出了点问题,不解决就不想睡觉。
  • 某个早晨,突然惊醒,灵感爆棚,打开电脑开始写代码。

不过,我是真的不推荐大家熬夜!拿我自己来说,每次熬夜就会导致我第二天甚至是第三天精神不振,严重影响效率。这还只是熬夜的短期影响,长期作息不健康的话,肯定对身体的摧残特别大。

道理都懂,不过,大部分小伙伴都像我一样,还是会偶尔熬夜。

02.整个框架的目录结构如下:

  • 框架实现部分按照不同的功能模块进行组织,比较直观。
  • 提供了完整的框架使用示例,并且还为其编写了测试。

(编辑:鹤壁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读