基于Java的MongoDB查询优化

基于Java的MongoDB查询优化,java,performance,mongodb,mongodb-query,Java,Performance,Mongodb,Mongodb Query,首先让我介绍一下我的用例——我有一个文档集合,其中存储了我的XML请求和相应的响应。此外,每个文档都有很多附带属性,其中一些属性被编入了索引,但请求和响应没有 每当我使用索引字段搜索时,性能就足够了。但在某些情况下,我必须根据请求或响应值使用正则表达式准备搜索 现在我做的是这样的: db.traffic.find( { $or: [ { request: { $regex: "some.* code=\"123\"} }, { response: {

首先让我介绍一下我的用例——我有一个文档集合,其中存储了我的XML请求和相应的响应。此外,每个文档都有很多附带属性,其中一些属性被编入了索引,但请求和响应没有

每当我使用索引字段搜索时,性能就足够了。但在某些情况下,我必须根据请求或响应值使用正则表达式准备搜索

现在我做的是这样的:

db.traffic.find(
    { $or: 
        [ { request: { $regex: "some.* code=\"123\"} },
          { response: { $regex: "some.* code=\"123\"} }] })
db.traffic.findOne($query: { $or: 
                            [ { request: { $regex: "some.* code=\"123\"} },
                              { response: { $regex: "some.* code=\"123\"} }] },
                   $orderby: { "counter": -1})
我把它翻译成Java代码。但是查询速度很慢,而且与其他查询相比需要花费大量的时间

我可以看到两种解决方案:

索引请求和响应-但我认为这不是一个好主意,因为它们非常长,而且很可能索引会很大。 首先使用一些索引字段进行查询,然后应用前面提到的查询,但按照找到的记录的降序,并选择第一个找到的记录,因此我想做如下操作

db.traffic.find({"conversationID": { $regex: "vendorName" }}).sort({"counter": -1}) 
    .findOne(
        { $or: 
            [ { request: { $regex: "some.* code=\"123\"} },
              { response: { $regex: "some.* code=\"123\"} }] })
最后,我的问题是:我是否应该选择更简单的解决方案,即为请求和响应编制索引?它会对我的索引大小产生什么影响


还是我应该选择第二条路?但是我的代码正确吗?它符合我的要求吗?

您尝试过这两种方法的解释吗

使用mongo shell测试查询,并在查询之前添加解释,以便:

db.traffic.explain()...

尝试这两种方法,您应该会得到一些指示方向的信息。

最后,我尝试了第二种解决方案,但由于无法在查询结果上运行findOne,因此我对其进行了轻微更改。但我找到了等价的语法

所以现在看起来是这样的:

db.traffic.find(
    { $or: 
        [ { request: { $regex: "some.* code=\"123\"} },
          { response: { $regex: "some.* code=\"123\"} }] })
db.traffic.findOne($query: { $or: 
                            [ { request: { $regex: "some.* code=\"123\"} },
                              { response: { $regex: "some.* code=\"123\"} }] },
                   $orderby: { "counter": -1})
而且现在性能好多了


此外,我还使用解释来检查实际速度。

无论任何人说什么,最好的答案总是同时尝试和基准测试