Nosql中按值或条件值搜索记录,拥有1亿条记录

Posted

技术标签:

【中文标题】Nosql中按值或条件值搜索记录,拥有1亿条记录【英文标题】:Search records by value or conditional value in Nosql with 100 millions records 【发布时间】:2018-09-26 11:07:01 【问题描述】:

我们正在寻找 NoSQL 数据库,我们可以在其中存储超过 1 亿条记录,其中包含许多字段,例如 Redis 中的集合。

并且数据库应该是可搜索的值。我们检查了 Redis,但它不支持任何按值搜索的选项。因为我们有数百万条记录,我们更新了一些记录字段,然后获取了一堆在特定时间没有更新的记录。

因此,对所有记录运行查询,然后检查哪些记录未从特定时间更新需要更多时间。因为在这个解决方案中,我们每分钟更新 100-200 条记录,然后根据值获取一堆记录。

因此,Redis 将无法在这里工作。我们可以选择存储到 MongoDB,但我们正在寻找支持按值搜索的键值数据库。

 
    "_id" : ObjectId("5ac72e522188c962d024d0cd"), 
    "itemId" : 11.0, 
    "url" : "http://www.testurl.com", 
    "failed" : 0.0, 
    "proxyProvider" : "Test", 
    "isLocked" : false, 
    "syncDurationInMinute" : 60.0, 
    "lastUpdatedTimeUTC" : "", 
    "nextUpdateTimeUTC" : "", 
    "targetCountry" : "US", 
    "requestContentType" : "JSON", 
    "group" : "US"

【问题讨论】:

二级索引和谓词过滤器 (aerospike.com/docs/guide/predicate.html) 在 Aerospike 中可用,可能对您的用例有用。 在 Aerospike 中,每条记录都有一个与之关联的上次更新时间元数据,可用于使用谓词过滤器进行搜索 - 与您的用例相关。您还可以使用二级索引根据 bin 中的数字或字符串值进行搜索。 【参考方案1】:

在 Aerospike 中,您可以使用 predicate filtering 查找自某个时间点以来未更新的记录,并仅返回该记录的 metadata,其中包括记录摘要(其唯一标识符)。您可以处理匹配的摘要并执行您需要执行的任何更新。这种类型的谓词过滤器非常快,因为它只需要查看保存在内存中的primary index 条目。请参阅 Java 客户端存储库中的 examples。

您不需要在这里使用二级索引,因为您想扫描一个命名空间(或该命名空间集合)中的所有记录,并且只需检查每条记录的“上次更新时间”元数据。由于您将只返回记录的摘要(唯一 ID)而不是任何实际数据,因此此扫描将永远不需要从 SSD 读取任何内容。结果会非常快速和轻量级(同样,只发回元数据)。在客户端中,您将迭代结果集,构建一个 ID 列表,然后对这些 ID 执行后续写入操作。

【讨论】:

以上是关于Nosql中按值或条件值搜索记录,拥有1亿条记录的主要内容,如果未能解决你的问题,请参考以下文章

搜索拥有超过 10 亿条记录的数据库的最有效方法是啥?

在 Scala 中按名称调用与按值调用,需要澄清

SQL 查询:如果满足搜索条件,则应返回单条记录,否则返回多条记录

按值或键进行嵌套数组搜索

Mongoid 按值或默认值查询

子文档 MongoDB 中键的不同值(1 亿条记录)