【问题标题】:Any way to make Mongo filtering dynamic records faster?有什么方法可以让 Mongo 更快地过滤动态记录?
【发布时间】:2014-12-05 01:26:08
【问题描述】:

场景

我有 Mongo 集合 Items,其中包含动态项目对象。目前我有超过 300 万条记录。我在 MongoSharp 中使用 C#,但我认为这与我的问题无关。

这是一个示例 Item它的字段远不止 3 个):

{
  _id : "1234567890",
  Code : 888596937,
  RefNumber : "GHTZKL",
  ...
}

AFAIK 使用 TextSearch 毫无意义,因为它不是真正的单词,只是一些代码,所以它不会给我任何有益的东西。我也无法将它们全部索引,从那时起我将不得不索引每个字段。

问题

现在,当我过滤数据时,大约需要 1-3 秒(在 ssd 上)。有什么方法可以让它更快地过滤我的项目或尽可能快地过滤我的项目?

【问题讨论】:

  • 这很简单:没有索引,计算机将不得不扫描每一项。如果有 2GB 的数据,即使它已经全部在 RAM 中,您的 CPU 也必须加载、检查并记住每个项目的结果,这需要时间。要么确定可以被索引的常见查询条件,并通过索引将候选集减少一到两个数量级,要么使用多键来模拟大量索引,或者使用专门的搜索数据库。无论如何,你必须从 O(n) 到 O(log n)。

标签: mongodb


【解决方案1】:

您没有提及要搜索的字段,但听起来您想搜索任意属性。这是 MongoDB 的一种常见设计和反模式边界。避免您现在进行的集合扫描的唯一方法是索引您要搜索的字段,但是当您不知道这些字段将是什么时,索引每个字段是不可能的。对此的解决方案是仅命名公共字段(并为其编制索引),然后将其他字段分组为文档中数组中的名称/值对。然后,您可以索引该数组以进行快速搜索。

关于 NVP 数组的注意事项:如果您的数组变得非常大(数百个属性),您的索引大小将惊人地爆炸。最好尽量保持数组大小相当小。

有关此设计模式的更多信息,请参阅 Asya 的 great writeup

【讨论】:

  • 我认为最好的解决方案是查看哪些字段被查询最多并索引这些字段,例如如果它有 12 个字段,则索引 3 个最常用的字段。
猜你喜欢
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多