如何选择NoSQL数据库引擎?

4
我们有一个具有以下参数的数据库:
  • 30k条记录,大小为7mb
  • 每秒20次插入
  • 每秒1000次更新
  • 每秒1000次范围选择,通过二级索引,大约每个10行
  • 至少需要一个二级索引
  • 需要某种机制来在75秒内未更新键时过期(可以通过编程垃圾回收器完成,但需要额外的“last_update”索引并将增加一些负载)
  • 不需要一致性
  • 不需要耐久性
  • 数据库应存储在内存中

目前我们使用Redis,但它没有二级索引,而它的keys index:foo:*太慢了。据我所知,Membase也没有二级索引。MySQL内存引擎和MongoDB具有表级锁定。哪种引擎适合我们的用例呢?


3
您无需将任何内容写入磁盘或同步状态,这是数据库设计中的两个最大复杂性问题,而您的数据集仅有7 MB。您是否考虑过在适当的数据结构中自行存储这些数据?在使用任何语言时,达到这种性能水平都不应该很难。 - willglynn
+1 with @willglynn。否则你有检查过Riak的功能吗? - Aurélien B
什么是“二级索引”?许多NoSQL技术,如MongoDB,在查询时仅使用一个查询,除非它是“$or”,因此用于查询的二级索引实际上并不起作用。此外,MongoDB未存储在内存中,因此在这里也不适用。 - Sammaye
@Sammaye 通常所说的“二级索引”是指除主索引之外的任何索引。因此对于MongoDB来说,这是在_id之外的任何索引。 - JohnnyHK
1
@JohnnyHK 哦,谢谢,有时候同一件事情会使用很多术语,很难全部掌握 :) - Sammaye
5个回答

2
我认为Redis确实支持二级索引,但它们不是隐式的:您必须显式地维护它们。排序集可用于范围扫描,但它不如MongoDB或关系数据库中方便。
如果您正在寻找一个类似Redis的服务器,并具有更好的范围扫描支持,我建议看看已停止的AlchemyDB项目或Aerospike 3(商业)产品(其中包括部分AlchemyDB的功能)。

Aerospike不是开源的。支持二级索引的整个意义在于它们会自动维护。 - Kostja

2
尝试使用http://tarantool.org/,它拥有二级索引并且完全在内存中。此外,它使用快速的异步IProto协议。它已被证明是稳定和非常快速的。

0

我认为他的意思是每个记录7MB。另一个选择是在Cassandra之上使用PlayOrm的可扩展SQL...更多的机器可以带来更好的性能,因为磁盘会在范围扫描等操作中并行工作。


0

我想如果你能够达到所需的性能要求,那么数据库是否在内存中就不重要了。

你的性能目标完全可以通过单个非复制和非分片的 MongoDB 实例来实现。Mongo 使用内存映射文件,因此所有数据将位于内存中,但是数据库将持续刷新到磁盘上。默认情况下,Mongo 使用“不安全”模式,这样可以消除大部分磁盘 I/O 的负担。对于你的使用情况而言,考虑使用这种模式而不是试图在应用程序代码中编写数据库应该完成的任务。

添加副本(Mongo 的群集术语)和/或分片将为你提供轻松增加性能的机会。多个索引(包括复合索引)、灵活的查询、批量插入和原子更新都是有助于提高性能并减轻应用程序代码负担的好功能。


0

有四种类型的NoSQL数据库。您可以检查哪一种满足您的要求。

1. 文档存储数据库。 文档存储数据库的原子单位是一个文档。 每个文档都是JSON格式的。不同的文档可以有不同的模式和包含不同的字段。 文档存储数据库允许对文档中的某些字段进行索引,从而基于这些字段实现更快的查询。

2. 列存储数据库。 列存储数据库的原子单位是表中的一列,这意味着数据是按列存储的。其列存储特性使得基于列的查询非常高效,并且由于每个列上的数据几乎具有相同的结构,因此它可以更好地压缩数据。

3. 键值存储数据库。 它很快。首先,这是因为使用了唯一的键,其次,因为大多数键值存储数据库将数据存储在内存(RAM)中,可以快速访问。

4. 图形存储数据库。 图形存储数据库包含表示实体的节点和表示实体之间关系的边。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接