Mongodb einfache Präfix-Abfrage mit Regex und Sortierung ist langsam
Ich bin mit dieser einfachen Präfix-Abfrage stecken. ObwohlMongo docs Wenn Sie das Präfix-Regex-Format (/ ^ a /) verwenden, ist die Abfrage ziemlich langsam, wenn ich versuche, die Ergebnisse zu sortieren:
940 Millis
db.posts.find ({hashtags: / ^ noticias /}). limit (15) .sort ({rank: -1}). hint ('hashtags_1_rank_-1'). explain ()
{
"cursor" : "BtreeCursor hashtags_1_rank_-1 multi",
"isMultiKey" : true,
"n" : 15,
"nscannedObjects" : 142691,
"nscanned" : 142692,
"nscannedObjectsAllPlans" : 142691,
"nscannedAllPlans" : 142692,
"scanAndOrder" : true,
"indexOnly" : false,
"nYields" : 1,
"nChunkSkips" : 0,
"millis" : 934,
"indexBounds" : {
"hashtags" : [
[
"noticias",
"noticiat"
],
[
/^noticias/,
/^noticias/
]
],
"rank" : [
[
{
"$maxElement" : 1
},
{
"$minElement" : 1
}
]
]
},
"server" : "XRTZ048.local:27017"
}
Die unsortierte Version derselben Abfrage ist jedoch superschnell:
0 Millis
db.posts.find ({hashtags: / ^ noticias /}). limit (15) .hint ('hashtags_1_rank_-1'). explain ()
{
"cursor" : "BtreeCursor hashtags_1_rank_-1 multi",
"isMultiKey" : true,
"n" : 15,
"nscannedObjects" : 15,
"nscanned" : 15,
"nscannedObjectsAllPlans" : 15,
"nscannedAllPlans" : 15,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"hashtags" : [
[
"noticias",
"noticiat"
],
[
/^noticias/,
/^noticias/
]
],
"rank" : [
[
{
"$maxElement" : 1
},
{
"$minElement" : 1
}
]
]
},
"server" : "XRTZ048.local:27017"
}
Die Abfrage ist auch schnell, wenn ich den regulären Ausdruck entferne und sortiere:
0 Millis
db.posts.find ({hashtags: 'noticias'}). limit (15) .sort ({rank: -1}). hint ('hashtags_1_rank_-1'). explain ()
{
"cursor" : "BtreeCursor hashtags_1_rank_-1",
"isMultiKey" : true,
"n" : 15,
"nscannedObjects" : 15,
"nscanned" : 15,
"nscannedObjectsAllPlans" : 15,
"nscannedAllPlans" : 15,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"indexBounds" : {
"hashtags" : [
[
"noticias",
"noticias"
]
],
"rank" : [
[
{
"$maxElement" : 1
},
{
"$minElement" : 1
}
]
]
},
"server" : "XRTZ048.local:27017"
}
Es scheint, als würde Mongo mit Hilfe von Regex und Sortierung viele Datensätze scannen. Beim Sortieren werden jedoch nur 15 gescannt, wenn ich den regulären Ausdruck nicht verwende. Was ist hier los?