Mongodb针对_id字段的排序说明

2024-04-26 05:40:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个mongodb数据库,它有3000万个字典,每个月的每一天都有100万行,所以所有的文档数都是30x1=3000万,数据库只有1个月的数据,我想列出并排序2018-07-01和2018-07-03之间的desc记录,所以在这两天之间我有200万行我的每个集合如下:

{
"_id":"5c66cf5b67011aa76ca597b6",
"timestamp":"2018-07-01 15:45:37.000",
"category":"category_1"
}

我为timestamp列添加了排序desc索引

当我尝试sort asc时,我得到的响应是0,1秒,但是我尝试sort desc,我得到的响应是702秒

我在造Python

^{pr2}$

当我解释用于排序说明的_id字段时:

db.IndicatorCollections.find().sort({_id : -1}).explain()

正在获取响应:

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "MongoBencmarkTestDB.IndicatorCollections",
        "indexFilterSet" : false,
        "parsedQuery" : {

        },
        "winningPlan" : {
            "stage" : "FETCH",
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "_id" : 1
                },
                "indexName" : "_id_",
                "isMultiKey" : false,
                "multiKeyPaths" : {
                    "_id" : [ ]
                },
                "isUnique" : true,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 2,
                "direction" : "backward",
                "indexBounds" : {
                    "_id" : [
                        "[MaxKey, MinKey]"
                    ]
                }
            }
        },
        "rejectedPlans" : [ ]
    },
    "serverInfo" : {
        "host" : "reterius-pc-MacBook-Pro.local",
        "port" : 27017,
        "version" : "4.0.3",
        "gitVersion" : "7ea530946fa7880364d88c8d8b6026bbc9ffa48c"
    },
    "ok" : 1
}

我的索引:

[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "MongoBencmarkTestDB.IndicatorCollections"
    },
    {
        "v" : 2,
        "key" : {
            "timestamp" : -1
        },
        "name" : "timestamp_-1",
        "ns" : "MongoBencmarkTestDB.IndicatorCollections"
    }
]

我想尽快得到回应,因为这很重要。


Tags: keynameid数据库false排序mongodbsort
3条回答

所以你得跑了数据库.collection.createIndex({timestamp:1,_id:-1})并再次检查它是否更快(应该是这样)。正如我之前所写的,Mongo只对一个查询使用一个索引,如果没有带有时间戳和降序id字段的索引,则速度很慢。在

当我解释我对pymongo的查询时,结果如下:

{'queryPlanner':{plannerVersion':1,'namespace':'MongoBencmarkTestDB.IndicatorCollections“,'indexFilterSet':False,'parsedQuery':{'$和':[{timestamp':{'$lte':日期时间。日期时间(2018,7,3,0,0)},{时间戳':{gte':日期时间。日期时间(2018,7,1,0,0)}}]},'winningPlan':{'stage':'SORT','sortPattern':{u id':-1},“limitAmount”:1000,“inputStage”:{“stage”:“SORT_KEY_GENERATOR”,“inputStage”:{“stage”:{'stage':{stage':{stage':'IXSCAN','keyPattern':{'timestamp':-1.0},“indexName”:“timestamp_u1”,“isMultiKey”:False,“multiKeyPaths”:{timestamp':[]},“isUnique”:False,“isPartial”:False,“indexVersion”:2,'direction':'forward','indexBounds':{'timestamp':['[new Date(1530576000000),new Date(153040300000)]]}}}},'rejectedPlans':[{'stage':'SORT','sortPattern':{u id':-1},“limitAmount”:1000,“inputStage”:{stage':{stage':'FETCH','inputStage':{stage':'IXSCAN','keyPattern':{timestage':1.0,“_id”:-1.0},“indexName”:“timestamp_1_uid_-1”,“isMultiKey”:False,'multiKeyPaths':{'timestamp':[],''u id':[]','isUnique':False,'isParse':False,'isPartial':False,'indexVersion':2,'direction':'forward','indexBounds':{timestamp':['[新日期(153040320000),新日期(1530576000000)],',''u id':['[MaxKey,MinKey]']}}}},{'stage':'LIMIT','limitAmount':1000,'inputStage':{'stage':'FETCH','filter':{'timestamp':{'$lte':日期时间。日期时间(2018,7,3,0,0)},{时间戳':{gte':日期时间。日期时间(2018,7,1,0,0)}}]},'inputStage':{'stage':'IXSCAN','keyPattern':{“U id”:1},“indexName”:“id”,“isMultiKey”:False,“multiKeyPaths”:{“u id”:[],“isUnique”:True,“isSparse”:False,“isPartial”:False,“indexVersion”:2,“direction”:“backward”,“indexBounds”:{“u id”:[“[MaxKey,MinKey]”]]}}}}}]},“executionStats”:{“executionSuccess”:True,“nReturned”:1000,“executionTimeMillis”:552284,“totalKeysExped”:2000000,“totalDocsExamined”:2000000,{71TimeLimit,'55TimeLimit':100SestUpdate,'307TimeLimit':307TimeLimit,'307TimeLimit':307TimeLimit,'307TimeLimit':307TimeLimit,'307TimeLimit':307TimeLimit,'307TimeLimit':307SesOfAdvanced,“inputStage”:{“stage”:“SORT_KEY_GENERATOR”,“nReturned”:2000000,“executionTimeMillisEstimate”:134910,“作品”:2000002,“高级”:2000000,“needTime”:1,“needYield”:0,“saveState”:53750,“restoreState”:53750,“IsoOf”:1,“失效”:0,“inputStage”:{“stage”:“FETCH”,“nReturned”:2000000,“executionTimeMillisEstimate”:132229,“works”:2000001,“高级”:2000000,“needTime”:0,“needYield”:0,“saveState”:53750,“restoreState”:53750,“isEOF”:1,“无效”:0,“docsExamined”:2000000,“alreadyHasObj”:0,“inputStage”:{“stage”:“IXSCAN”,“nReturned”:2000000,“executionTimeMillisEstimate”:2077,“works”:2000001,“advanced”:2000000,“needTime”:0,“needYield”:0,“saveState”:53750,“restoreState”:53750,“isEOF”:1,“无效”:0,“keyPattern”:{“timestamp”:-1.0},“indexName”:“timestamp_-1”,“isMultiKey”:False,“multiKeyPaths”:{“timestamp”:[]},“isUnique”:False,“isSparse”:False,“isPartial”:False,“indexVersion”:2,“direction”:“forward”,'indexBounds':{'timestamp':['[新日期(1530576000000),新日期(153040320000)]']},'keyspected':2000000,'seeks':1,'dupsted':0,'dupsDropped':0,'seenInvalidated':0}}},'allPlansExecution':[{'nReturned':101,'executionTimeMillisEstimate':137134,'totalKeysExamined':2000000,'totalDocsExamined':2000000,'executionStages':{'stage':'SORT',nReturned':101,'executionTimeMillisEstimate':137134,'works':2000103,'advanced':101,'needTime':2000002,'needYield':0,'saveState':53742,'isEOF':0,'invalidates':0,'sortPattern':{“U id':-1},'memUsage':9056307,'memLimit':33554432,'limitAmount':1000,'inputStage':{'stage':'排序密钥生成器','nReturned':2000000,'executionTimeMillisEstimate':134910,'works':2000002,'advanced':2000000,'needTime':1,'needYield':0,'saveState':53742,'RestoreSoft':1,'invalidates':0,'inputStage':{'stage':'FETCH',“nReturned”:2000000,“ExecutionTimeMillisesEstimate”:132229,“works”:2000001,“高级”:2000000,“needTime”:0,“needYield”:0,“saveState”:53742,“restoreState”:53742,“IsOf”:1,“无效”:0,“DocSeMined”:2000000,“alreadyHasObj”:0,“inputStage”:{“stage”:“IXSCAN”,“nReturned”:2000000,“ExecutionTimeMillisesEstimate”:2077,“works”:2000001,“高级”:2000000,“needTime”:0,“needYield”:0,“saveState”:53742,“restoreState”:53742,“IsOf”:1,“无效”:0,“keyPattern”:{“timestamp”:-1.0},“indexName”:“timestamp_U1”,“isMultiKey”:False,“multiKeyPaths”:{“timestamp”:[]},“isUnique”:False,“IsParse”:False,“isPartial”:假,“indexVersion”:2,'direction':'forward','indexBounds':{'timestamp':['[new Date(1530576000000),new Date(153040300000)]']},'keyspected':2000000,'seedested':0,'dupsDropped':0,'seenInvalidated':0}}},{nReturned':101,'ExecutionTimeMillisesEstimate':286826,'totalKeysExamined':2000000,'totalDocsExamined':2000000,“executionStages”:{“stage”:“SORT”,“nReturned”:101,“executionTimeMillisEstimate”:286826,“作品”:2000103,“高级”:101,“needTime”:2000002,“needYield”:0,“saveState”:53750,“restoreState”:53750,“isEOF”:0,“invalidates”:0,“sortPattern”:{“u id”:-1},“memUsage”:9056307,“memLimit”:33554432,“limitAmount”:1000,“inputStage”:{“stage”:“排序键生成器”,“nReturned”:2000000,“executionTimeMillisEstimate”:284785,“作品”:2000002,“高级”:2000000,“needTime”:1,“needYield”:0,“saveState”:53750,“restoreState”:53750,“IsoOf”:1,“无效”:0,“inputStage”:{“stage”:“FETCH”,“nReturned”:2000000,“executionTimeMillisEstimate”:128225,“works”:2000001,“高级”:2000000,“needTime”:0,“needYield”:0,“saveState”:53750,“restoreState”:53750,“isEOF”:1,“无效”:0,“docseMined”:2000000,“alreadyHasObj”:0,“inputStage”:{“stage”:“IXSCAN”,“nReturned”:2000000,“ExecutionTimeMillisesEstimate”:1579,“作品”:2000001,“高级”:2000000,“needTime”:0,“needYield”:0,“saveState”:53750,“restoreState”:53750,“isEOF”:1,“无效”:0,“keyPattern”:{“timestamp”:1.0,“_id”:-1.0},“indexName”:“timestamp_1_uid_1”,“isMultiKey”:False,“multiKeyPaths”:{“timestamp”:[],“_id”:[],“isUnique”:False,“isSparse”:False,“isPartial”:False,“indexVersion”:2,“方向”:“forward”,'indexBounds':{'timestamp':['[新日期(153040320000),新日期(1530576000000)]','u id':['[MaxKey,MinKey]']},'keyspected':2000000,'seeks':1,'dupsted':0,'dupsDropped':0,'seeInValidated':0}}}},{'nReturned':0,'ExecutionTimeMilliseMate':126373,'TotalKeysChecked':2000103,'totalDocsExamined':2000103,'executionStages':{'stage':'LIMIT','nReturned':0,'executionTimeMillisEstimate':126373,'works':2000103,'advanced':0,'needTime':2000103,'needYield':0,'saveState':53750,'isEOF':0,'invalidates':0,'limitAmount':1000,'inputStage':{'stage':'FETCH','filter':{'timestamp':{'lte':日期时间。日期时间(2018年7月3日0日,0)}},{timestamp':{gte':日期时间。日期时间(2018,7,1,0,0)}}]},'nReturned':0,'executionTimeMillisEstimate':126232,'works':2000103,'advanced':0,'needTime':2000103,'needYield':0,'saveState':53750,'IsOof':0,'invalidates':0,'DocSeMined':2000103,'alreadyHasObj':0,'inputStage':{'stage':'IXSCAN',“nReturned”:2000103,“executionTimeMillisEstimate”:2205,“作品”:2000103,“高级”:2000103,“needTime”:0,“needYield”:0,“saveState”:53750,“restoreState”:53750,“isEOF”:0,“无效”:0,“keyPattern”:1},“indexName”:“id”,'isMultiKey':False,'multiKeyPaths':{''u id':[]},'isUnique':True,'IsParse':False,'isPartial':False,'indexVersion':2,'direction':'backward','indexBounds':{“U id':['[MaxKey,MinKey]']},'KeysChecked':2000103,'seeks':1,'dupsDropped':0,'SeeInValidated':0}}}}]},'serverInfo':{'host':'reterius pc MacBook-专业本地','port':27017,'version':'4.0.3','gitVersion':'7ea530946fa7880364d88c8d8b6026bbc9ffa48c'},“确定”:1.0}

这个问题已经有几个月了,但如果你还需要答案(或者其他人需要答案)

您正在字段“_id”上进行排序。在

但它是索引{ timestamp: 1, _id: -1 }的第二个字段(非前缀)。对非前缀索引的排序不会使用索引,这就是排序不使用复合索引的原因。在

将索引更改为{ _id: -1, timestamp: 1},然后检查explain查询是否使用该索引。或者,您也可以尝试对“timestamp”字段进行排序,如果它解决了您的目的。在

参考号:https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/#sort-and-non-prefix-subset-of-an-index

相关问题 更多 >