“写优化”的数据结构(3):small-splittable-tree

作者:一工

如果你感到buffered b-tree 或者 x–y tree还是有点复杂,这里还有简单的。

如果不走tree-like派系,那就走短、平、快的small-splittable-tree的路子,甚至可以玩small-splittable-list。

 

短就是每个tree单元要小。
平就是tree高度要低。
快就是分裂起来要快(compaction)。
这里的tree可以是b-tree或其他的tree结构都没问题,但在分裂起来,一定要快,不能hang住写线程。

 

如果你嫌tree结构有高度,还是复杂,那可以来简单的small-splittable-list,也就是所有数据插入完毕,最终是个顺序的list,这个list由多个segment构成,任何两个segment之间不会有区间重叠。

 

write
——–
每个segment反映到磁盘就是一个文件,比如1.SSL。
这个SSL文件由2部分组成:header和blocks。
header记录区间信息,比如: <pivot1, blockid1> … <pivotn, blockidn>,用于数据归属block查找。
block里存放的是key-value数据(追加写),每个block大小是固定的(比如256KB),当block满了,就分裂成2个block,当一个SSL里的block都满了(个数等于 SSL-size/block-size),则对这个SSL进行分裂,这个分裂过程也是很快的,没有数据merge过程。

 

read
——
首先根据key定位到你属于哪个SSL,然后根据header定位到你属于哪个block,这样就搞定了。

small-splittable-list基本就是在往AOF靠拢,但是读起来是很快的。

这种数据结构的缺点就是page cache利用率不高,共享部分太少了,如果是tree,从root到某些inner-node的路径是可共享的,只好做记录级缓存了,kernel帮不了你。

 

 

 

小结

 

做“写优化”的数据结构读不一定慢的。
比如在写的过程中,你已经走了root-node1-node2…-nodex这条path,可认为它已在page cache里,当你读的时候,root无需从磁盘读取,node1也无需从磁盘,这样“读”就揩“写”的油。反过来,“写”也可以揩”读“的油,所以即使在读写混合的时候,仍可互利。

如果node大小为4MB(leaf节点可设置的更大些),一个高度为6的tree就是TB级了,这样leaf节点是很少被touch到的,所以在page cache里的基本都是inner node,很爽了

如果你“嫌弃”page cache的机制,可以尝试自己的cache + Direct IO (cascadb用的AIO)这条路。

期待更多的引擎来尝试下buffered tree!

BTW:大块写在SSD上的好处就是Write amplification(http://en.wikipedia.org/wiki/Write_amplification)的降低。

时间: 2024-09-09 18:54:08

“写优化”的数据结构(3):small-splittable-tree的相关文章

“写优化”的数据结构(2):buffered tree

作者:一工   这一小节谈谈buffered tree吧. buffered tree有几种设计方法吧. 一种是buffered b-tree,就是整个tree的结构还是类b-tree的,包括节点分裂都一样,每个pivot都有一个子节点,但是与b-tree的区别就是写的时候,先写到root节点,然后根据节点的饱和度进行往下刷数据操作.数据的表现行为完全不一样.   这个很像数据在一个"外力"的作用下,不停的被往下推,直到叶节点.     另一种就是类似 2–3 tree(http://

“写优化”的数据结构(1):AOF和b-tree之间

作者: 一工   这里谈的"写优化",是针对HDD(hard disk drive)的,宗旨就是尽量避免disk seek的产生. 首先拿AOF(Append Only File)和b-tree两个"端"谈起.   1) AOF 无论是随机写还是顺序写,在AOF里是没有什么区别,也是最快的.如果搞个坐标图,它的"江湖"地位就是: 它几乎没有disk seek,但随机读是不可接受的!     2) b-tree 各大存储引擎御用的数据结构,但这里要

C语言判断临界矩阵表示的图是否存在回路?请问代码怎么写,是数据结构里面的?

问题描述 C语言判断临界矩阵表示的图是否存在回路?请问代码怎么写,是数据结构里面的? C语言判断临界矩阵表示的图是否存在回路?请问代码怎么写,是数据结构里面的? 解决方案 递归遍历,把找到的节点标记出来,如果遇到遍历的节点已经被标记,就说明有回路.

今天给同学写5个数据结构算法的题...感觉很有价值的几个题..感兴趣的坐下。。

  1.判断一个顺序表是否对称 2用向量作存储结构,设计以算法仅用一个辅助结点,实现将线性表中的结点循环右移k位的运算 3.已知A[n]中的元素为整形.设计算法将其调整为左右两部分.左边所有元素为奇数,右边所有元素为偶数, 4,设计以算法,逆置带头结点的动态链表L, 5单链表以非递减有序排列,设计算法实现在单链表中删去值相同的多余结点, 6假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,是编写算法将A表和B表归并成一个按元素值递减有序排列的线性表C,并要求利用原表的结点空间存

想扩展你的数据库吗?那么先了解一下I/O

作为一名http://www.aliyun.com/zixun/aggregation/6434.html">软件开发者,我们非常看重那些抽象化的东西.API越简单,对我们越有吸引力.辩证地讲,MongoDB最大的优势就是"优雅"的API和它的敏捷性,这让开发者的编码过程变得异常的简单. 但是,当MongoDB涉及到大数据可扩展性问题时,开发者还是需要了解一下它的底层,弄明白那些潜在的问题,然后才能快速地进行解决.如果不理解,最终可能会选择一个低效的解决方案,而且浪费了

经验分享:SEO优化方案书怎么写

现在很多SEOer进入一个公司的第一件事就是熟悉公司,第二步恐怕就要写优化方案了吧,下面是我进入公司写的SEO方案.如果你是老鸟就一飘而过吧,希望对新手有一定的帮助. 金富网站SEO优化方案 一.网站基本信息 1.搜索引擎收录情况 分析:各大搜索引擎收录良好,快照较慢,解决办法:每天更新网站,发布产品信息或者新闻信息. 2.网站权重及流量分析 网站百度权重截图: 百度首页暂时没有搜索量较高的关键词. 网站流量截图: 网站自开通统计以来,历史最高IP为30,每日平均13,还有待提升. 二.网站优化

如何写出高效的JavaScript JS性能优化窍门

本文我们来讨论一下JavaScript性能优化. Firefox拥有目前最快的JavaScript解析器 SpiderMonkey,有各种各样的让JavaScript的速度更快的努力,其中一个是asm.js. Asm.js是JavaScript是由Emscripten产生的一个子集,它为C/C++编绎成的JavaScript代码做了很多优化,编译型后的代码很难看,这就是为什么你不能自己写优化后的代码,但它运行非常快.我建议你阅读一下这篇文章 好了,我们的目标是写速度更快的JavaScript代码

MySQL · TokuDB · TokuDB索引结构--Fractal Tree

背景介绍 TokuDB采用的是Fractal Tree作为索引的数据组织方式.它是一种面向磁盘I/O优化的数据结构,采用"分期偿还"策略减少在数据插入过程中从root节点到leaf节点的搜索过程.这种搜索过程可以简称为locate_position,就是寻找要插入key在Tree中位置的过程. 一般B+Tree的插入过程分为两个部分: Locate_position: 从root开始使用binary search方法递归地寻找应该插入到哪个子节点上,直到在leaf节点找到应该插入的位置

TokuDB索引结构--Fractal Tree

背景介绍 TokuDB采用的是Fractal Tree作为索引的数据组织方式.它是一种面向磁盘I/O优化的数据结构,采用"分期偿还"策略减少在数据插入过程中从root节点到leaf节点的搜索过程.这种搜索过程可以简称为locate_position,就是寻找要插入key在Tree中位置的过程. 一般B+Tree的插入过程分为两个部分: Locate_position: 从root开始使用binary search方法递归地寻找应该插入到哪个子节点上,直到在leaf节点找到应该插入的位置