- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
使用两个数据库来说明这个例子:CouchDB和 Cassandra .
CouchDB 使用 B+ 树作为文档索引(使用 a clever modification 在其仅附加环境中工作)——更具体地说,当文档被修改(插入/更新/删除)时,它们被附加到正在运行的数据库文件以及一个完整的 Leaf -> Node 路径,来自 B+ 树的所有节点,这些节点在文档之后立即受到更新修订的影响。
这些零碎的索引修订与修改一起内联,这样完整的索引是附加在文件末尾的最新索引修改以及数据文件中仍然相关的其他部分的联合并且还没有被修改。
Searching the B+ tree is O(logn).
Cassandra 在内存中和表中对记录键进行排序(让我们将它们视为这个问题的数组)并将它们作为单独的(排序的)写出 sorted-string tables不时。
我们可以把所有这些表的集合看作是“索引”(据我理解)。
Cassandra 需要 compact/combine these sorted-string tables不时创建更完整的索引文件表示。
Searching a sorted array is O(logn).
假设在 CouchDB 中维护部分 B+ 树 block 与在 Cassandra 中维护部分排序字符串索引之间的复杂程度相似,并且假设两者都提供 O(logn) 搜索时间,您认为哪一个可以更好地表示数据库指数和为什么?
我特别好奇是否有一个实现细节优于另一个使其特别有吸引力,或者如果它们都是洗涤,您只需选择您喜欢使用的数据结构/对开发人员更有意义。
谢谢你的想法。
最佳答案
在比较 BTree 索引和 SSTable 索引时,您应该考虑写入复杂度:
当随机写入写时复制 BTree 时,您将引发随机读取(以复制叶节点和路径)。因此,虽然我在磁盘上的写入是顺序的,但对于大于 RAM 的数据集,这些随机读取将很快成为瓶颈。对于类似 SSTable 的索引,写入时不会发生此类读取 - 只会有顺序写入。
您还应该考虑到,在最坏的情况下,对 BTree 的每次更新都可能引发 log_b N 次 IO - 也就是说,您最终可能会为每个键写入 3 或 4 个 block 。如果 key 大小远小于 block 大小,这将非常昂贵。对于类似 SSTable 的索引,每个写入 IO 将包含尽可能多的新键,因此每个键的 IO 成本更接近 1/B。
在实践中,这使得类似 SSTable 的速度(对于随机写入)比 BTree 快数千倍。
在考虑实现细节时,我们发现实现类似 SSTable 的索引(几乎)无锁要容易得多,而 B 树的锁定策略变得相当复杂。
您还应该重新考虑您的阅读成本。你是正确的,BTree 是 O(log_b N) 随机点读取的随机 IO,但类似 SSTable 的索引实际上是 O(#sstables .log_b N)。如果没有合适的合并方案,#sstables 与 N 成正比。有多种技巧可以解决这个问题(例如,使用布隆过滤器),但这些技巧对小的随机范围查询没有帮助。这是我们在 Cassandra 中发现的:
Cassandra under heavy write load
这就是为什么我们的 (GPL) 存储引擎 CaSTLe 在合并时略有不同,并且可以实现更好的 (O(log^2 N)) 范围查询性能,同时略微牺牲写入性能 (O(log ^2 N/B))。在实践中,我们发现它在写入方面也比 Cassandra 的 SSTable 索引更快。
如果您想了解更多,我已经讲过它是如何工作的:
关于database - 数据库索引的排序字符串表(SSTable)或 B+ 树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8651346/
nodetool cfstats 显示以下输出: Read Count: 746287 Read Latency: 8.772114064696291 ms. Write Count: 135629
有没有办法控制 SSTable 的最大大小,例如 100 MB,这样当 CF 的数据实际超过 100MB 时,Cassandra 会创建下一个 SSTable? 最佳答案 不幸的是,答案并不是那么简单
在 BigTable/GFS 和 Cassandra 术语中,SSTable 的定义是什么? 最佳答案 排序字符串表(借自google)是一个键/值字符串对的文件,按键排序 关于computer-sc
所以我正在研究 Cassandra 并试图了解其架构,并且我正在阅读 wiki 中的以下页面: http://wiki.apache.org/cassandra/MemtableSSTable 因此,
我试图更好地理解 Cassandra 中 sstables 的不变性。当数据存在于 memtable 中时,在插入操作或更新/删除操作中会发生什么非常清楚。但是不清楚当我想修改已经被刷新的数据时会发生
使用自制软件安装 cassandra12 后,它会退出并显示以下消息: java.lang.RuntimeException: Can't open incompatible SSTable! Cur
我们使用的是 cassandra 2.0.17,我们有一个包含 50% 选择、40% 更新和 10% 插入(无删除)的表。 为了对此类表具有较高的读取性能,我们发现建议使用 LeveledCompac
我已经意识到一些 sstables 不会被丢弃,即使它们只包含墓碑。 使用手动主要压缩这些 sstables 被删除。 也许它需要将 unchecked_tombstone_compaction 与
在 Cassandra 2.x 中,当我删除一列或多列时,它们会在 Memtable 中收到一个逻辑删除,但数据不会被删除。在某个时刻,Memtable 会刷新到 SSTable,其中包括已删除的数据
我正在尝试使用 sstable2json 实用程序将 sstables 转换为 json。它工作正常,但对于计数器列,它给出了一个非常长的字符串值。 我的建表语句:创建表计数器1 (值计数器, 名称变
根据我在 cassandra 中的理解 当客户端将数据写入单个服务器时,它会写入提交日志(仅追加日志而没有随机搜索)。然后将数据放入驻留在内存中的 MEMTable 中。然后确认写入成功。当 MEMT
根据: http://www.datastax.com/docs/1.0/ddl/column_family#about-column-family-compression RDBMS 看到压缩导致性
阅读 nodetool 标记的问题后编辑。 我们每天拍摄我们的单节点 cassandra 数据库的快照。如果我想在该节点上或在运行不同 cassandra 实例的临时服务器上恢复快照,我的理解是我必须
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 4 年前。 Improve this qu
我最近开始使用 Cassandra 数据库。我已经在本地机器中安装了单节点集群。我正在使用 Cassandra 1.2.3。 我在互联网上阅读这篇文章,发现了这一行- Cassandra writes
当使用 LeveledCompactionStrategy 时,sstables 被组织在“级别”中。是否可以查看文件属于哪个级别? 背景:我有一堆我最终会压实的墓碑。我很好奇这些墓碑到底有多少层。
在我运行之后:- sudo service cassandra start 然后是 sudo service cassandra status 我得到一个无法访问 Cassandra 的 pidfil
我是Cassandra等nosql数据库的新手,目前看到这个二级索引和sstable附加二级索引。有些我对在 Cassandra 中使用二级索引的目的感到困惑,关系数据库和带二级索引的 Cassand
使用两个数据库来说明这个例子:CouchDB和 Cassandra . CouchDB CouchDB 使用 B+ 树作为文档索引(使用 a clever modification 在其仅附加环境中工
我在哪里可以找到有关哪个版本的 Cassandra 支持哪个版本的 SSTables 的更多信息。 最近我注意到 DSE Cassandra 正在生成 SSTables bti ,而 Apache C
我是一名优秀的程序员,十分优秀!