Hi, I have a db with about 6MM entries and have indexes on "startDate" and "deviceID" fields. Filtering and sorting seems to be unreasonably slow.
db.trips.find({"deviceID": {$in: ['2FC96F6D-4094-46B9-994E-3208FF4DFCE8']}}).explain() is almost instant.
db.trips.find({"deviceID": {$in: ['2FC96F6D-4094-46B9-994E-3208FF4DFCE8']}}).sort({"startDate": -1}).limit(50).explain() .... Takes about 13 seconds
Can someone take a look at the query plan and see what is wrong? Why does it seem to have 2 identical "inputStages" for the second query?
OUTPUT: db.trips.find({"deviceID": {$in: ['2FC96F6D-4094-46B9-994E-3208FF4DFCE8']}}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "ubermeter.trips",
"indexFilterSet" : false,
"parsedQuery" : {
"deviceID" : {
"$in" : [
"2FC96F6D-4094-46B9-994E-3208FF4DFCE8"
]
}
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"deviceID" : 1
},
"indexName" : "deviceID_1",
"isMultiKey" : false,
"direction" : "forward",
"indexBounds" : {
"deviceID" : [
"[\"2FC96F6D-4094-46B9-994E-3208FF4DFCE8\", \"2FC96F6D-4094-46B9-994E-3208FF4DFCE8\"]"
]
}
}
},
"rejectedPlans" : [ ]
},
"ok" : 1
}
OUTPUT: db.trips.find({"deviceID": {$in: ['2FC96F6D-4094-46B9-994E-3208FF4DFCE8']}}).sort({"startDate": -1}).limit(50).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "ubermeter.trips",
"indexFilterSet" : false,
"parsedQuery" : {
"deviceID" : {
"$in" : [
"2FC96F6D-4094-46B9-994E-3208FF4DFCE8"
]
}
},
"winningPlan" : {
"stage" : "OR",
"inputStages" : [
{
"stage" : "SORT",
"sortPattern" : {
"startDate" : -1
},
"limitAmount" : 50,
"inputStage" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"deviceID" : 1
},
"indexName" : "deviceID_1",
"isMultiKey" : false,
"direction" : "forward",
"indexBounds" : {
"deviceID" : [
"[\"2FC96F6D-4094-46B9-994E-3208FF4DFCE8\", \"2FC96F6D-4094-46B9-994E-3208FF4DFCE8\"]"
]
}
}
}
},
{
"stage" : "SORT",
"sortPattern" : {
"startDate" : -1
},
"inputStage" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"deviceID" : 1
},
"indexName" : "deviceID_1",
"isMultiKey" : false,
"direction" : "forward",
"indexBounds" : {
"deviceID" : [
"[\"2FC96F6D-4094-46B9-994E-3208FF4DFCE8\", \"2FC96F6D-4094-46B9-994E-3208FF4DFCE8\"]"
]
}
}
}
}
]
},
"rejectedPlans" : [
{
"stage" : "FETCH",
"filter" : {
"deviceID" : {
"$in" : [
"2FC96F6D-4094-46B9-994E-3208FF4DFCE8"
]
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"startDate" : 1
},
"indexName" : "startDate_1",
"isMultiKey" : false,
"direction" : "backward",
"indexBounds" : {
"startDate" : [
"[MaxKey, MinKey]"
]
}
}
}
]
},
"serverInfo" : {
"host" : "ubermeter-database",
"port" : 27017,
"version" : "3.0.12",
"gitVersion" : "33934938e0e95d534cebbaff656cde916b9c3573"
},
"ok" : 1
}
Here are my indexes too in case that helps:
> db.trips.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "ubermeter.trips"
},
{
"v" : 1,
"key" : {
"startDate" : 1
},
"name" : "startDate_1",
"ns" : "ubermeter.trips",
"background" : true
},
{
"v" : 1,
"key" : {
"deviceID" : 1
},
"name" : "deviceID_1",
"ns" : "ubermeter.trips"
}
]