MongoDB menggabungkan kunci gabungan dalam beberapa cara dan menggunakannya sebagai kunci dalam BTree.
Saat menemukan item tunggal - Urutan node di pohon tidak relevan.
Jika Anda mengembalikan berbagai node - Elemen yang berdekatan akan berada di bawah cabang pohon yang sama. Semakin dekat node dalam jangkauan, semakin cepat node tersebut dapat diambil.
Dengan indeks bidang tunggal - Urutan tidak masalah. Jika mereka berdekatan dalam urutan menaik, mereka juga akan berdekatan dalam urutan menurun.
Bila Anda memiliki kunci majemuk - Urutan mulai penting.
Misalnya, jika kuncinya adalah A ascending B ascending index mungkin terlihat seperti ini:
Baris AB
1 1 1
2 2 6
3 2 7
4 3 4
5 3 5
6 3 6
7 5 1
Query untuk A ascending B descending perlu melewati indeks agar dapat mengembalikan baris dan akan menjadi lebih lambat. Misalnya akan mengembalikan Row1, 3, 2, 6, 5, 4, 7
Kueri berkisar dalam urutan yang sama seperti indeks hanya akan mengembalikan baris secara berurutan dalam urutan yang benar.
Menemukan record dalam BTree membutuhkan waktu O (Log (n)). Menemukan rentang rekaman secara berurutan hanya OLog (n) + k di mana k adalah jumlah rekaman yang akan dikembalikan.
Jika catatan rusak, biayanya bisa setinggi OLog (n) * k
1, 3, 2, 6, 5, 4, 7
?The jawaban sederhana yang Anda cari adalah bahwa arah hanya penting ketika Anda menyortir pada dua atau lebih bidang .
Jika Anda menyortir
{a : 1, b : -1}
:Indeks
{a : 1, b : 1}
akan lebih lambat dari indeks{a : 1, b : -1}
sumber
{a: -1, b: -1}
, haruskah saya memiliki{a: -1, b: -1}
indeks atau akan{a: 1, b: 1}
cukup.{a: 1, b: 1}
indeks harus cukup karena membalikkan indeks sepenuhnya baik-baik saja. mis. Indeks pada{a: 1}
dapat digunakan untuk penyortiran{a: -1}
Mengapa indeks
Pahami dua poin kunci.
Indeks tidak gratis. Mereka mengambil memori, dan memberlakukan penalti kinerja saat melakukan penyisipan, pembaruan, dan penghapusan. Biasanya pencapaian kinerja dapat diabaikan (terutama dibandingkan dengan perolehan dalam kinerja baca), tetapi itu tidak berarti bahwa kami tidak bisa pintar-pintar membuat indeks kami.
Bagaimana Indeks
Mengidentifikasi kelompok bidang apa yang harus diindeks bersama adalah tentang memahami kueri yang Anda jalankan. Urutan bidang yang digunakan untuk membuat indeks Anda sangat penting. Kabar baiknya adalah, jika Anda salah melakukan order, indeks tidak akan digunakan sama sekali, jadi akan mudah dikenali dengan penjelasan.
Mengapa Menyortir
Kueri Anda mungkin perlu Diurutkan. Namun pengurutan bisa menjadi operasi yang mahal, jadi penting untuk memperlakukan bidang yang Anda sortir seperti bidang yang Anda kueri. Jadi akan lebih cepat kalau sudah index. Namun ada satu perbedaan penting, bidang yang Anda sortir harus merupakan bidang terakhir dalam indeks Anda. Satu-satunya pengecualian untuk aturan ini adalah jika bidang juga merupakan bagian dari kueri Anda, maka aturan harus-menjadi-terakhir tidak berlaku.
Bagaimana Menyortir
Anda dapat menentukan urutan pada semua kunci indeks atau subset; namun, kunci sortir harus terdaftar dalam urutan yang sama seperti yang muncul di indeks. Misalnya, pola kunci indeks {a: 1, b: 1} dapat mendukung pengurutan di {a: 1, b: 1} tetapi tidak di {b: 1, a: 1}.
Pengurutan harus menentukan arah pengurutan yang sama (yaitu naik / turun) untuk semua kuncinya sebagai pola kunci indeks atau menentukan arah pengurutan terbalik untuk semua kuncinya sebagai pola kunci indeks. Misalnya, pola kunci indeks {a: 1, b: 1} dapat mendukung pengurutan pada {a: 1, b: 1} dan {a: -1, b: -1} tetapi tidak pada {a: -1 , b: 1}.
Misalkan ada indeks ini:
sumber
{ a: 1, b: 1, c: 1 }
apakah Anda benar-benar membutuhkan indeks{ a: 1}
dan{ a: 1, b: 1}
atau indeks{ a: 1, b: 1, c: 1 }
mencakup semua kasus? Jika kueri selalu menggunakan pengurutan yang sama: 1 tidak ada pengurutan dalam kueri dengan -1