Hi
I have just tested the 2.6 and i always have the problem describe in teh Jira SERVER-9257 for my case. In this comment i use the query and index detailed in the description of the jira SERVER-9257.
Case 1 : old index
With the old "2d" index the query on position+date don't use the 2d index but only the index on creationDate.
db.ntr_tracks.find({"detection.position": { $geoWithin: { $box: [ [ 0.7724536441932998, 50.61956018018893 ], [ 2.483031806726593, 51.42851043057254 ] ] } }, creationDate: { $gt: new ISODate("20120801T000000"), $lt: ISODate("20120802T000000") } }).sort({ creationDate: 1 }).limit(1000).explain(); { "cursor" : "BtreeCursor creationDate", "isMultiKey" : false, "n" : 1000, "nscannedObjects" : 47625, "nscanned" : 47626, "nscannedObjectsAllPlans" : 52620, "nscannedAllPlans" : 52621, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 411, "nChunkSkips" : 0, "millis" : 216, "indexBounds" : { "creationDate" : [ [ ISODate("2012-08-01T00:00:00.000Z"), ISODate("2012-08-02T00:00:00.000Z") ] ] }, "server" : "fmwd0012:27017", "filterSet" : false, "stats" : { "type" : "LIMIT", "works" : 47625, "yields" : 411, "unyields" : 411, "invalidates" : 0, "advanced" : 1000, "needTime" : 46625, "needFetch" : 0, "isEOF" : 1, "children" : [ { "type" : "FETCH", "works" : 47625, "yields" : 411, "unyields" : 411, "invalidates" : 0, "advanced" : 1000, "needTime" : 46625, "needFetch" : 0, "isEOF" : 0, "alreadyHasObj" : 0, "forcedFetches" : 0, "matchTested" : 1000, "children" : [ { "type" : "IXSCAN", "works" : 47625, "yields" : 411, "unyields" : 411, "invalidates" : 0, "advanced" : 47625, "needTime" : 0, "needFetch" : 0, "isEOF" : 0, "keyPattern" : "{ creationDate: 1 }", "boundsVerbose" : "field #0['creationDate']: (new Date(1343779200000), new Date(1343865600000))", "isMultiKey" : 0, "yieldMovedCursor" : 0, "dupsTested" : 0, "dupsDropped" : 0, "seenInvalidated" : 0, "matchTested" : 0, "keysExamined" : 47626, "children" : [] } ] } ] } }
If i force using the 2d index with hint the query doesn't respond (i have +16Go of data). I think that the index isn't used.
db.ntr_tracks.find({"detection.position": { $geoWithin: { $box: [ [ 0.7724536441932998, 50.61956018018893 ], [ 2.483031806726593, 51.42851043057254 ] ] } }, creationDate: { $gt: new ISODate("20120801T000000"), $lt: ISODate("20120802T000000") } }).sort({ creationDate: 1 }).hint('detection.position_2d_creationDate_1').limit(1000).explain()
Edit: i finally have a result:
{ "cursor" : "GeoBrowse-box", "isMultiKey" : false, "n" : 1000, "nscannedObjects" : 400694, "nscanned" : 400694, "nscannedObjectsAllPlans" : 400694, "nscannedAllPlans" : 400694, "scanAndOrder" : true, "indexOnly" : false, "nYields" : 6618, "nChunkSkips" : 0, "millis" : 1903392, "indexBounds" : { "detection.position" : [ [ [ 1.40625, 50.625 ], [ 2.8125, 52.03125 ] ], [ [ 1.0546875, 50.2734375 ], [ 1.40625, 50.625 ] ], [ [ 0.703125, 50.2734375 ], [ 1.0546875, 50.625 ] ], [ [ 0.703125, 50.625 ], [ 1.40625, 51.328125 ] ], [ [ 1.0546875, 51.328125 ], [ 1.40625, 51.6796875 ] ], [ [ 0.703125, 51.328125 ], [ 1.0546875, 51.6796875 ] ], [ [ 2.4609375, 50.2734375 ], [ 2.8125, 50.625 ] ], [ [ 2.109375, 50.2734375 ], [ 2.4609375, 50.625 ] ], [ [ 1.7578125, 50.2734375 ], [ 2.109375, 50.625 ] ], [ [ 1.40625, 50.2734375 ], [ 1.7578125, 50.625 ] ] ] }, "server" : "fmwd0012:27017", "filterSet" : false, "stats" : { "type" : "SORT", "works" : 401697, "yields" : 6618, "unyields" : 6618, "invalidates" : 0, "advanced" : 1000, "needTime" : 400696, "needFetch" : 0, "isEOF" : 1, "forcedFetches" : 0, "memUsage" : 580000, "memLimit" : 33554432, "children" : [ { "type" : "KEEP_MUTATIONS", "works" : 400696, "yields" : 6618, "unyields" : 6618, "invalidates" : 0, "advanced" : 1786, "needTime" : 398909, "needFetch" : 0, "isEOF" : 1, "children" : [ { "type" : "FETCH", "works" : 400696, "yields" : 6618, "unyields" : 6618, "invalidates" : 0, "advanced" : 1786, "needTime" : 398909, "needFetch" : 0, "isEOF" : 1, "alreadyHasObj" : 400694, "forcedFetches" : 0, "matchTested" : 1786, "children" : [ { "type" : "GEO_2D", "works" : 400694, "yields" : 0, "unyields" : 0, "invalidates" : 0, "advanced" : 400694, "needTime" : 0, "needFetch" : 0, "isEOF" : 1, "geometryType" : "box", "field" : "detection.position", "boundsVerbose" : [ "(1.40625,50.625) -->> (2.8125,52.0313)", "(1.05469,50.2734) -->> (1.40625,50.625)", "(0.703125,50.2734) -->> (1.05469,50.625)", "(0.703125,50.625) -->> (1.40625,51.3281)", "(1.05469,51.3281) -->> (1.40625,51.6797)", "(0.703125,51.3281) -->> (1.05469,51.6797)", "(2.46094,50.2734) -->> (2.8125,50.625)", "(2.10938,50.2734) -->> (2.46094,50.625)", "(1.75781,50.2734) -->> (2.10938,50.625)", "(1.40625,50.2734) -->> (1.75781,50.625)" ], "children" : [] } ] } ] } ] } }
Case 2 : new index, date first - query on date
With a second test where i have the following index only :
{ "creationDate": 1, "detection.position": "2dsphere" }
The following query
db.ntr_tracks.find({creationDate: { $gt: new ISODate("20120801T000000"), $lt: ISODate("20120802T000000") }}).sort({ creationDate: 1 }).limit(1000).explain()
Take 1168608 ms .... (but if i create an index on creationDate the query take less than 100ms).
The explain show that we use BtreeCursor on 2dsphere is used :
{ "cursor" : "BtreeCursor 2dsphere", "isMultiKey" : false, "n" : 1000, "nscannedObjects" : 11629283, "nscanned" : 11629284, "nscannedObjectsAllPlans" : 11629283, "nscannedAllPlans" : 11629284, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 433063, "nChunkSkips" : 0, "millis" : 118608, "indexBounds" : { "creationDate" : [ [ { "$minElement" : 1 }, { "$maxElement" : 1 } ] ], "detection.position" : [ [ { "$minElement" : 1 }, { "$maxElement" : 1 } ] ] }, "server" : "fmwd0012:27017", "filterSet" : false, "stats" : { "type" : "LIMIT", "works" : 12062212, "yields" : 433063, "unyields" : 433063, "invalidates" : 0, "advanced" : 1000, "needTime" : 11628283, "needFetch" : 432929, "isEOF" : 1, "children" : [ { "type" : "FETCH", "works" : 12062212, "yields" : 433063, "unyields" : 433063, "invalidates" : 0, "advanced" : 1000, "needTime" : 11628283, "needFetch" : 432929, "isEOF" : 0, "alreadyHasObj" : 0, "forcedFetches" : 0, "matchTested" : 1000, "children" : [ { "type" : "IXSCAN", "works" : 11629283, "yields" : 433063, "unyields" : 433063, "invalidates" : 0, "advanced" : 11629283, "needTime" : 0, "needFetch" : 0, "isEOF" : 0, "keyPattern" : "{ creationDate: 1, detection.position: \"2dsphere\" }", "boundsVerbose" : "field #0['creationDate']: [MinKey, MaxKey], field #1['detection.position']: [MinKey, MaxKey]", "isMultiKey" : 0, "yieldMovedCursor" : 0, "dupsTested" : 0, "dupsDropped" : 0, "seenInvalidated" : 0, "matchTested" : 0, "keysExamined" : 11629284, "children" : [] } ] } ] } }
Case 3 : new index, date first - query on date and position
If i make query that search by position, the query is very quick (so no problem, it is better than 2.4)
db.ntr_tracks.find({"detection.position": { $geoWithin: { $geometry: { type: "Polygon", coordinates: [ [ [ 0.7724536441932998, 50.61956018018893 ], [ 0.7724536441932998, 51.42851043057254 ], [ 2.483031806726593, 51.42851043057254 ], [ 2.483031806726593, 50.61956018018893 ], [ 0.7724536441932998, 50.61956018018893 ] ] ] } } }, creationDate: { $gt: new ISODate("20121001T000000"), $lt: ISODate("20121002T000000") } }).sort({ creationDate: 1 }).limit(1000).explain() { "cursor" : "BtreeCursor 2dsphere", "isMultiKey" : false, "n" : 1000, "nscannedObjects" : 1752, "nscanned" : 47634, "nscannedObjectsAllPlans" : 1752, "nscannedAllPlans" : 47634, "scanAndOrder" : false, "indexOnly" : false, "nYields" : 14, "nChunkSkips" : 0, "millis" : 184, "indexBounds" : { "creationDate" : [ [ ISODate("2012-08-01T00:00:00.000Z"), ISODate("2012-08-02T00:00:00.000Z") ] ], "detection.position" : [ [ "2f0332302", "2f0332303" ], [ "2f0332312", "2f0332312" ], [ "2f03323123", "2f03323123" ], [ "2f033231233", "2f033231234" ], [ "2f0332313", "2f0332314" ], [ "2f0332320", "2f0332321" ], [ "2f0332321", "2f0332322" ], [ "2f0332322", "2f0332322" ], [ "2f03323220", "2f03323221" ], [ "2f0332323", "2f0332324" ], [ "2f0332330", "2f0332331" ], [ "2f0332331", "2f0332332" ] ] }, "server" : "fmwd0012:27017", "filterSet" : false, "stats" : { "type" : "LIMIT", "works" : 1752, "yields" : 14, "unyields" : 14, "invalidates" : 0, "advanced" : 1000, "needTime" : 752, "needFetch" : 0, "isEOF" : 1, "children" : [ { "type" : "FETCH", "works" : 1752, "yields" : 14, "unyields" : 14, "invalidates" : 0, "advanced" : 1000, "needTime" : 752, "needFetch" : 0, "isEOF" : 0, "alreadyHasObj" : 0, "forcedFetches" : 0, "matchTested" : 1000, "children" : [ { "type" : "IXSCAN", "works" : 1752, "yields" : 14, "unyields" : 14, "invalidates" : 0, "advanced" : 1752, "needTime" : 0, "needFetch" : 0, "isEOF" : 0, "keyPattern" : "{ creationDate: 1, detection.position: \"2dsphere\" }", "boundsVerbose" : "field #0['creationDate']: (new Date(1343779200000), new Date(1343865600000)), field #1['detection.position']: [\"2f0332302\", \"2f0332303\"), [\"2f0332312\", \"2f0332312\"], [\"2f03323123\", \"2f03323123\"], [\"2f033231233\", \"2f033231234\"), [\"2f0332313\", \"2f0332314\"), [\"2f0332320\", \"2f0332321\"), [\"2f0332321\", \"2f0332322\"), [\"2f0332322\", \"2f0332322\"], [\"2f03323220\", \"2f03323221\"), [\"2f0332323\", \"2f0332324\"), [\"2f0332330\", \"2f0332331\"), [\"2f0332331\", \"2f0332332\")", "isMultiKey" : 0, "yieldMovedCursor" : 0, "dupsTested" : 0, "dupsDropped" : 0, "seenInvalidated" : 0, "matchTested" : 0, "keysExamined" : 47634, "children" : [] } ] } ] } }
Thanks for the help.
- is related to
-
SERVER-13701 Query using 2d index throws exception when using explain()
- Closed