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.*$"}}]}]}

我有关于"国家"one_answers"注册组织"的常规索引。但根据mongo文档,一个查询只能使用一个索引,我也可以从上面查询的explain()中看到这一点。

所以我的问题是,在上面的查询中,实现更好性能的最佳选择是什么。我应该中断"one_answers"运算并在内存中进行交集吗。更进一步,我也将在查询中进行"否"操作。

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

这个查询有很多错误。

在MongoDB中,带有正则表达式的嵌套条件永远不会变得更快。MongoDB并不是"数据发现"的最佳工具(例如,用于发现未知信息的特殊、多条件查询)。当您知道自己正在生成的度量时,MongoDB的速度非常快。但是,不是为了数据发现。

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

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

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

另一个提示:

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