0

我正在尝试从 java 驱动程序对 mongo 集群运行一些基于通配符/正则表达式的查询。Mongo 副本集配置:3 个成员副本 16 CPU(超线程),24G RAM Linux x86_64 集合大小:6M 行,7G 数据

客户端是具有最新 mongo-java 驱动程序的 localhost (mac osx 10.8)

使用带有 readpref = primaryPrefered 的 java 驱动程序进行查询

 { "$and" : [{ "$or" : [ { "country" : "united states"}]} , { "$or" : [ { "registering_organization" : { "$regex" : "^.*itt.*hartford.*$"}} , { "registering_organization" : { "$regex" : "^.*met.*life.*$"}} , { "registering_organization" : { "$regex" : "^.*cardinal.*health.*$"}}]}]}

我对“国家”和“注册组织”都有定期索引。但是根据 mongo 文档,单个查询只能使用一个索引,我也可以从上述查询的 explain() 中看到这一点。

所以我的问题是在上述查询中实现更好性能的最佳选择是什么。我应该打破'and'操作并在内存交集中做。更进一步,我也将在查询中进行“不”操作。

我认为我的应用程序将来可能会变成报告/分析,但这并不重要,或者我不打算进行相应的设计。

4

1 回答 1

1

这个查询有很多问题。

带有正则表达式的嵌套条件在 MongoDB 中永远不会变得更快。MongoDB 不是“数据发现”的最佳工具(例如,用于发现未知信息的临时、多条件查询)。当您知道要生成的指标时,MongoDB 会飞速发展。但是,不适用于数据发现。

如果这是您正在运行的常见查询,那么我将创建一个名为“united_states_or_health_care”的属性,并将值设置为创建日期的时间戳。使用此方法,您可以将逻辑从查询转移到文档架构。这是考虑使用 MongoDB 进行扩展的一种常见方式。

如果您正在进行数据发现,您有几个不同的选择:

  • 让您的应用程序连接不同查询的结果
  • 在辅助 MongoDB 上运行查询,并接受较慢的性能
  • 使用 .将您的数据通过管道传输到 Postgresql mosql。Postgres 将更快地运行这些数据发现查询。

另一个提示:

您的正则表达式没有以快速的方式锚定。最好通过“findable_registering_organization”过滤器运行“registering_organization”属性。过滤器会将组织分解为一组可查询的名称子集,您将完全使用正则表达式。如果您可以通过行业查找过滤传入的名称,则 +2 分。

于 2013-08-19T19:38:23.807 回答