MongoDB $或+ sort + sharding =没有使用索引

时间:2014-01-05 11:37:11

标签: mongodb sorting

考虑以下查询,这是一个相当简单的用例:

db.Transactions.find({
    $or: [
        { "from.addresses" : "name@domain.com" },
        { "to.addresses" : "name@domain.com" }
    ]
}).sort({ "time" : -1 });

“from.addresses”和“to.addresses”是索引字段(数组)。那些指数不是复合的。目前没有关于“时间”的索引。 请注意,我在此集合上使用分片,这可能会影响查询的行为。

问题是:

  • 如果我正在对“时间”进行排序(正确地将事务分页给用户),则不使用索引并扫描整个集合(数千万个文档):。explain()=>所有分片上的“cursor”:“BasicCursor”
  • 如果删除.sort(),则正确使用索引
  • 如果我删除$或,则正确使用索引

是否可以使MongoDB使用索引? 我目前正在考虑运行2个单独的查询($或每一个一个)并自己合并(比$或行为更快)。

请在下面找到完整的.explain()(在比真实的小集合上运行,在真正的集合上运行需要几个小时):

{
        "clusteredType" : "ParallelSort",
        "shards" : {
                "rs/mongo-a:27017,mongo-b:27017" : [
                        {
                                "cursor" : "BasicCursor",
                                "isMultiKey" : false,
                                "n" : 1356,
                                "nscannedObjects" : 45589,
                                "nscanned" : 45589,
                                "nscannedObjectsAllPlans" : 45589,
                                "nscannedAllPlans" : 45589,
                                "scanAndOrder" : true,
                                "indexOnly" : false,
                                "nYields" : 356,
                                "nChunkSkips" : 8014,
                                "millis" : 44726,
                                "indexBounds" : {

                                },
                                "server" : "mongo-a:27017"
                        }
                ],
                "rs1/mongo-a1:27018,mongo-b1:27018" : [
                        {
                                "cursor" : "BasicCursor",
                                "isMultiKey" : false,
                                "n" : 3435,
                                "nscannedObjects" : 15663,
                                "nscanned" : 15663,
                                "nscannedObjectsAllPlans" : 15663,
                                "nscannedAllPlans" : 15663,
                                "scanAndOrder" : true,
                                "indexOnly" : false,
                                "nYields" : 4,
                                "nChunkSkips" : 0,
                                "millis" : 505,
                                "indexBounds" : {

                                },
                                "server" : "mongo-a1:27018"
                        }
                ],
                "rs2/mongo-a2:27018,mongo-b2:27018" : [
                        {
                                "cursor" : "BasicCursor",
                                "isMultiKey" : false,
                                "n" : 2208,
                                "nscannedObjects" : 10489,
                                "nscanned" : 10489,
                                "nscannedObjectsAllPlans" : 10489,
                                "nscannedAllPlans" : 10489,
                                "scanAndOrder" : true,
                                "indexOnly" : false,
                                "nYields" : 2,
                                "nChunkSkips" : 0,
                                "millis" : 329,
                                "indexBounds" : {

                                },
                                "server" : "mongo-a2:27018"
                        }
                ],
                "rs3/mongo-a3:27018,mongo-b3:27018" : [
                        {
                                "cursor" : "BasicCursor",
                                "isMultiKey" : false,
                                "n" : 2249,
                                "nscannedObjects" : 10500,
                                "nscanned" : 10500,
                                "nscannedObjectsAllPlans" : 10500,
                                "nscannedAllPlans" : 10500,
                                "scanAndOrder" : true,
                                "indexOnly" : false,
                                "nYields" : 7,
                                "nChunkSkips" : 0,
                                "millis" : 439,
                                "indexBounds" : {

                                },
                                "server" : "mongo-a3:27018"
                        }
                ],
                "rs4/mongo-a4:27018,mongo-b4:27018" : [
                        {
                                "cursor" : "BasicCursor",
                                "isMultiKey" : false,
                                "n" : 2251,
                                "nscannedObjects" : 10488,
                                "nscanned" : 10488,
                                "nscannedObjectsAllPlans" : 10488,
                                "nscannedAllPlans" : 10488,
                                "scanAndOrder" : true,
                                "indexOnly" : false,
                                "nYields" : 4,
                                "nChunkSkips" : 0,
                                "millis" : 336,
                                "indexBounds" : {

                                },
                                "server" : "mongo-a4:27018"
                        }
                ],
                "rs5/mongo-a5:27018,mongo-b5:27018" : [
                        {
                                "cursor" : "BasicCursor",
                                "isMultiKey" : false,
                                "n" : 1175,
                                "nscannedObjects" : 5220,
                                "nscanned" : 5220,
                                "nscannedObjectsAllPlans" : 5220,
                                "nscannedAllPlans" : 5220,
                                "scanAndOrder" : true,
                                "indexOnly" : false,
                                "nYields" : 2,
                                "nChunkSkips" : 0,
                                "millis" : 376,
                                "indexBounds" : {

                                },
                                "server" : "mongo-a5:27018"
                        }
                ]
        },
        "cursor" : "BasicCursor",
        "n" : 12674,
        "nChunkSkips" : 8014,
        "nYields" : 375,
        "nscanned" : 97949,
        "nscannedAllPlans" : 97949,
        "nscannedObjects" : 97949,
        "nscannedObjectsAllPlans" : 97949,
        "millisShardTotal" : 46711,
        "millisShardAvg" : 7785,
        "numQueries" : 6,
        "numShards" : 6,
        "millis" : 44939
}

1 个答案:

答案 0 :(得分:2)

您可能需要观看JIRA:https://jira.mongodb.org/browse/SERVER-1205