Mongodb查询优化 - 并行运行查询

时间:2013-08-19 17:59:39

标签: mongodb

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

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

使用带有readpref = primaryPreffered

的java驱动程序进行查询
 { "$and" : [{ "$or" : [ { "country" : "united states"}]} , { "$or" : [ { "registering_organization" : { "$regex" : "^.*itt.*hartford.*$"}} , { "registering_organization" : { "$regex" : "^.*met.*life.*$"}} , { "registering_organization" : { "$regex" : "^.*cardinal.*health.*$"}}]}]}

我对“country”和“registering_organization”都有常规索引。但是根据mongo文档,单个查询只能使用一个索引,我也可以从上面的查询中看到explain()。

所以我的问题是在上述查询中获得更好性能的最佳替代方案是什么。 我应该打破'和'操作,并在内存交叉点做。更进一步,我也将在查询中进行“不”操作。

我认为我的应用程序可能会在未来转变为报告/分析,但这不符合要求,或者我不打算相应地进行设计。

1 个答案:

答案 0 :(得分:1)

这个查询有很多问题。

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

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

如果您正在进行数据发现,则可以选择以下几种方法:

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

另一个提示:

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