Database design 真实世界的高插入(更重要的是调整值大小的更新)nosql

Database design 真实世界的高插入(更重要的是调整值大小的更新)nosql,database-design,asynchronous,transactions,nosql,distributed-computing,Database Design,Asynchronous,Transactions,Nosql,Distributed Computing,我正在研究一个可以用两个键值表表示的IR问题 表Q:具有在插入时确定的固定大小,更新表增量计数器,当数据在协议缓冲区中编码时,大小可能会移动,当数值变高时,它们可能会增加字节大小(变量int编码) 表p:包含对表Q的引用,它是一对多关系,因为一个p可以指向多个Q。更新增加计数器并添加引用。很多碎片 表Q和p的数据访问特性与标准IR全文检索结构的反向索引完全相同。Q是文件,P是文字-张贴 我尝试了以下嵌入式数据库 SQLite标准化形式,速度太慢,不并行,存储开销太大。表现最差 Kyotodb。伪

我正在研究一个可以用两个键值表表示的IR问题

表Q:具有在插入时确定的固定大小,更新表增量计数器,当数据在协议缓冲区中编码时,大小可能会移动,当数值变高时,它们可能会增加字节大小(变量int编码)

表p:包含对表Q的引用,它是一对多关系,因为一个p可以指向多个Q。更新增加计数器并添加引用。很多碎片

表Q和p的数据访问特性与标准IR全文检索结构的反向索引完全相同。Q是文件,P是文字-张贴

我尝试了以下嵌入式数据库

  • SQLite标准化形式,速度太慢,不并行,存储开销太大。表现最差
  • Kyotodb。伪事务(全局锁定)性能下降,在超过500K源行时线性增加。尝试了几种不同的方法
  • Berkley db,页锁定事务,内存中。超过600万条源代码行后,性能变得不可接受。Cpu已经饱和,但我认为死锁和自旋锁是导致使用的原因
  • Leveldb(我很快就放弃了,它在全局锁IIRC下工作)。也许它保留了写性能。我没让它跑那么久
  • 这就是我希望优化的情况:

  • 存储/CPU时间可预测性
  • 超高插入率
  • 一致但不持久(非同步写入)
  • 设计用于平行插入
  • 没有Erlang,也没有java
  • 是的,如果需要,我可以将数据模型折叠成面向文档的结构。这对于mongodb来说是必须的,因为没有事务

    这家伙似乎知道他是什么,因为他在插入式表演中给了mongodb一个三星级,我很受诱惑。即使Json对我来说似乎是浪费。我也可以切换到SQL server,因为它在插入负载下是惊人的,但它不能扩展到重铁之外那么,mongodb是我的场景中的蜜蜂吗,有人尝试hypertable vs mongodb吗?其他建议?

    编辑:自我回答

    前提:

  • 大型事务范围是魔鬼
  • 分裂是魔鬼
  • 因此,在转向面向文档的数据库或分布式键值数据库之前,通常要修复应用程序的数据模型,以便更好地映射到此类数据模型。分布式数据库没有事务,mongo甚至可以对单个文档进行原子更新——因此,在事务范围内使用更新时,Q必须是您的文档,P将索引Q中的变量元素

    因此,我要为我的数据模型切换到不同的表示形式。我将确保这两个表在其生存期内都是静态大小的(使用协议缓冲区fixed32而不是int32),此外,我将取消pivot(反求)表P,并为此将大部分P合并到Q中

    这将解决碎片问题并减少事务范围,插入p可以在事务之外完成。我也将在愤怒中尝试leveldb。我有一种感觉,它将在整个处理过程中保持其性能水平,而不管它不会并行化