Masalahnya adalah tidak ada indeks Anda yang benar-benar membantu dengan kueri yang diurutkan. Inilah alasan tingginya jumlah objek yang dipindai dan keberadaan SORT_KEY_GENERATOR
stage (urutan dalam memori, terbatas hingga 32 MB).
Kueri yang tidak diurutkan, sebaliknya, dapat menggunakan { category: 1, _id: 1 }
atau { category: 1, _id: 1, sticky: 1, lastPostAt: 1 }
indeks. Perhatikan bahwa sangat valid untuk menggunakan salah satunya, karena salah satunya berisi awalan dari yang lain. Lihat Awalan untuk detail selengkapnya.
MongoDB find()
kueri biasanya hanya menggunakan satu indeks, jadi indeks gabungan tunggal harus memenuhi semua parameter kueri Anda. Ini akan mencakup kedua parameter find()
dan sort()
.
Artikel yang bagus tentang bagaimana indeks Anda harus dibuat tersedia di Mengoptimalkan Indeks Senyawa MongoDB. Mari kita ambil poin utama artikel, di mana urutan indeks gabungan harus equality --> sort --> range :
"Bentuk" kueri Anda adalah:
db.collection.find({category:..., _id: {$gt:...}})
.sort({sticky:-1, lastPostAt:-1, _id:1})
.limit(25)
Kami melihat bahwa:
category:...
adalah kesetaraansticky:-1, lastPostAt:-1, _id:1
adalah mengurutkan_id: {$gt:...}
adalah rentang
Jadi indeks gabungan yang Anda butuhkan adalah:
{category:1, sticky:-1, lastPostAt:-1, _id:1}
Dimana rencana kemenangan dari explain()
keluaran kueri Anda dengan indeks di atas menunjukkan:
"winningPlan": {
"stage": "LIMIT",
"limitAmount": 25,
"inputStage": {
"stage": "FETCH",
"inputStage": {
"stage": "IXSCAN",
"keyPattern": {
"category": 1,
"sticky": -1,
"lastPostAt": -1,
"_id": 1
},
"indexName": "category_1_sticky_-1_lastPostAt_-1__id_1",
"isMultiKey": false,
"multiKeyPaths": {
"category": [ ],
"sticky": [ ],
"lastPostAt": [ ],
"_id": [ ]
},
"isUnique": false,
"isSparse": false,
"isPartial": false,
"indexVersion": 2,
"direction": "forward",
"indexBounds": {
"category": [
"[ObjectId('5a779b31f4fa724121265142'), ObjectId('5a779b31f4fa724121265142')]"
],
"sticky": [
"[MaxKey, MinKey]"
],
"lastPostAt": [
"[MaxKey, MinKey]"
],
"_id": [
"(ObjectId('5a779b5cf4fa724121269be8'), ObjectId('ffffffffffffffffffffffff')]"
]
}
}
}
}
Perhatikan bahwa paket pemenang tidak berisi SORT_KEY_GENERATOR
panggung. Ini berarti indeks dapat digunakan sepenuhnya untuk menanggapi kueri yang diurutkan.