Takeaways Key
Pengindeksan di MongoDB dapat meningkatkan prestasi dan throughput dengan mengurangkan bilangan dokumen penuh yang perlu dibaca, dengan itu meningkatkan prestasi aplikasi.
- MongoDB menyokong beberapa jenis indeks, termasuk indeks _id lalai, indeks sekunder, indeks kompaun, indeks multikey, dan indeks kompaun multikey. Setiap jenis berfungsi dengan tujuan tertentu dan digunakan untuk pelbagai jenis pertanyaan.
- lebih daripada satu indeks boleh ditakrifkan pada koleksi, tetapi pertanyaan hanya boleh menggunakan satu indeks semasa pelaksanaannya. Indeks terbaik dipilih semasa runtime oleh pengoptimuman pertanyaan MongoDB.
- Walaupun pengindeksan secara dramatik dapat meningkatkan operasi baca, ia juga menanggung kosnya sendiri. Operasi pengindeksan menduduki ruang dan menyebabkan overhead tambahan pada setiap memasukkan, mengemas kini, dan memadam operasi pada koleksi. Oleh itu, manfaat mengindeks koleksi baca-berat lebih daripada koleksi-koleksi berat.
-
Pengindeksan adalah salah satu konsep yang lebih penting untuk bekerja dengan MongoDB. Pemahaman yang betul adalah kritikal kerana pengindeksan secara dramatik dapat meningkatkan prestasi dan throughput dengan mengurangkan bilangan dokumen penuh untuk dibaca, dengan itu meningkatkan prestasi permohonan kami. Kerana indeks boleh sedikit sukar difahami, siri dua bahagian ini akan melihat dengan lebih dekat kepada mereka.
Dalam artikel ini kita akan meneroka lima jenis indeks berikut:
default _id index
- indeks sekunder
- Indeks kompaun
- indeks multikey
- Indeks kompaun multikey
-
Terdapat beberapa jenis lain untuk dibincangkan, tetapi saya secara logiknya menyimpannya untuk Bahagian 2 untuk memberikan pemahaman yang jelas dan mengelakkan sebarang kekeliruan.
Walaupun lebih daripada satu indeks boleh ditakrifkan pada koleksi, pertanyaan hanya boleh menggunakan satu indeks semasa pelaksanaannya. Keputusan memilih indeks terbaik daripada pilihan yang ada dibuat pada masa yang diperlukan oleh pengoptimuman pertanyaan MongoDB.
Artikel ini mengandaikan bahawa anda mempunyai pemahaman asas tentang konsep MongoDB (seperti koleksi, dokumen, dll.) Dan melakukan pertanyaan asas menggunakan PHP (seperti Cari dan Masukkan). Jika tidak, saya cadangkan anda membaca artikel pemula kami: Pengenalan kepada MongoDB dan MongoDB Revisited.
Untuk siri ini kami akan menganggap kami mempunyai koleksi bernama jawatan yang dihuni dengan 500 dokumen yang mempunyai struktur berikut:
Sekarang, mari kita meneroka pelbagai jenis pengindeksan secara terperinci.
default _id index
<span>{
</span> <span>"_id": <span>ObjectId</span>("5146bb52d852470060001f4"),
</span> <span>"comments": {
</span> <span>"0": "This is the first comment",
</span> <span>"1": "This is the second comment"
</span> <span>},
</span> <span>"post_likes": 40,
</span> <span>"post_tags": {
</span> <span>"0": "MongoDB",
</span> <span>"1": "Tutorial",
</span> <span>"2": "Indexing"
</span> <span>},
</span> <span>"post_text": "Hello Readers!! This is my post text",
</span> <span>"post_type": "private",
</span> <span>"user_name": "Mark Anthony"
</span><span>}</span>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Secara lalai, MongoDB mencipta indeks lalai pada medan _id untuk setiap koleksi. Setiap dokumen mempunyai medan _id yang unik sebagai kunci utama, 12-bait objek. Apabila tidak ada indeks lain yang tersedia, ini digunakan secara lalai untuk semua jenis pertanyaan.
Untuk melihat indeks untuk koleksi, buka shell Mongodb dan lakukan yang berikut:
Kaedah getIndexes () mengembalikan semua indeks untuk koleksi kami. Seperti yang anda lihat, kami mempunyai indeks lalai dengan nama _id_ . Medan utama menunjukkan bahawa indeks berada di medan _id, dan nilai 1 menunjukkan perintah menaik. Kami akan belajar tentang pesanan di bahagian seterusnya.
indeks sekunder
Bagi kes -kes di mana kita mahu menggunakan pengindeksan pada medan selain daripada bidang _id, kita perlu menentukan indeks tersuai. Katakan kami ingin mencari jawatan berdasarkan medan user_name. Dalam kes ini, kami akan menentukan indeks tersuai pada medan user_name koleksi. Indeks tersuai sedemikian, selain daripada indeks lalai, dipanggil indeks sekunder.
Untuk menunjukkan kesan pengindeksan pada pangkalan data, mari kita secara ringkas menganalisis prestasi pertanyaan tanpa mengindeks terlebih dahulu. Untuk ini, kami akan melaksanakan pertanyaan untuk mencari semua jawatan yang mempunyai user_name dengan "Jim Alexandar".
<span>{
</span> <span>"_id": <span>ObjectId</span>("5146bb52d852470060001f4"),
</span> <span>"comments": {
</span> <span>"0": "This is the first comment",
</span> <span>"1": "This is the second comment"
</span> <span>},
</span> <span>"post_likes": 40,
</span> <span>"post_tags": {
</span> <span>"0": "MongoDB",
</span> <span>"1": "Tutorial",
</span> <span>"2": "Indexing"
</span> <span>},
</span> <span>"post_text": "Hello Readers!! This is my post text",
</span> <span>"post_type": "private",
</span> <span>"user_name": "Mark Anthony"
</span><span>}</span>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Kaedah penting yang sering digunakan dengan pengindeksan dijelaskan () yang mengembalikan maklumat yang berkaitan dengan pengindeksan. Output di atas jelas () adalah seperti yang ditunjukkan di bawah:
Beberapa kunci penting yang perlu dilihat ialah:
kursor - Menunjukkan indeks yang digunakan dalam pertanyaan. - BasicCursor menunjukkan bahawa indeks _id lalai digunakan dan MongoDB terpaksa mencari keseluruhan koleksi. Melangkah ke hadapan, kita akan melihat bahawa apabila kita menggunakan pengindeksan, btreecursor akan digunakan bukan BasicCursor .
n - Menunjukkan bilangan dokumen pertanyaan yang dikembalikan (satu dokumen dalam kes ini). -
nscannedObjects - Menunjukkan bilangan dokumen yang dicari oleh pertanyaan (dalam kes ini, semua 500 dokumen koleksi telah dicari). Ini boleh menjadi operasi dengan overhead besar jika bilangan dokumen dalam koleksi sangat besar. -
nscanned - Menunjukkan bilangan dokumen yang diimbas semasa operasi pangkalan data. -
Sebaik -baiknya, n harus sama dengan atau dekat dengan NSCanned, yang bermaksud bilangan dokumen minimum telah dicari.
Sekarang, mari kita laksanakan pertanyaan yang sama tetapi menggunakan indeks sekunder. Untuk membuat indeks, laksanakan perkara berikut dalam shell MongoDB:
Kami mencipta indeks di medan user_name
Dalam koleksi Posts menggunakan kaedah Pastikan (). Saya pasti anda telah mencatatkan nilai hujah pesanan kepada kaedah yang menunjukkan sama ada naik (1) atau menurun (-1) perintah untuk carian. Untuk lebih memahami perkara ini, perhatikan bahawa setiap dokumen mempunyai medan timestamp. Jika kita mahu jawatan paling terkini terlebih dahulu, kita akan menggunakan perintah menurun. Untuk jawatan tertua terlebih dahulu, kami akan memilih perintah menaik.
Selepas membuat indeks, kaedah yang sama () dan terangkan () digunakan untuk melaksanakan dan menganalisis pertanyaan seperti dahulu. Output adalah:
Output menunjukkan bahawa pertanyaan menggunakan btreecursor bernama user_name_1 (yang kami tentukan sebelumnya) dan mengimbas hanya satu dokumen yang bertentangan dengan 500 dokumen yang dicari dalam pertanyaan sebelumnya tanpa mengindeks.
Buat masa ini, faham bahawa semua indeks MongoDB menggunakan struktur data BTREE dalam algoritmanya, dan BTREECURSOR adalah kursor lalai untuknya. Perbincangan terperinci tentang Btreecursor adalah dari skop untuk artikel ini, tetapi ini tidak menjejaskan pemahaman lanjut.
Perbandingan di atas menunjukkan bagaimana indeks dapat meningkatkan prestasi pertanyaan secara dramatik.
Indeks kompaun
Akan ada kes apabila pertanyaan menggunakan lebih daripada satu bidang. Dalam kes sedemikian, kita boleh menggunakan indeks kompaun. Pertimbangkan pertanyaan berikut yang menggunakan medan post_type dan post_lik:
<span>{
</span> <span>"_id": <span>ObjectId</span>("5146bb52d852470060001f4"),
</span> <span>"comments": {
</span> <span>"0": "This is the first comment",
</span> <span>"1": "This is the second comment"
</span> <span>},
</span> <span>"post_likes": 40,
</span> <span>"post_tags": {
</span> <span>"0": "MongoDB",
</span> <span>"1": "Tutorial",
</span> <span>"2": "Indexing"
</span> <span>},
</span> <span>"post_text": "Hello Readers!! This is my post text",
</span> <span>"post_type": "private",
</span> <span>"user_name": "Mark Anthony"
</span><span>}</span>
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Menganalisis pertanyaan ini dengan menjelaskan (), memberikan hasil berikut, yang menunjukkan bahawa pertanyaan menggunakan BasicCursor dan semua 500 dokumen diimbas untuk mendapatkan satu dokumen.
Ini sangat tidak cekap, jadi mari kita gunakan beberapa indeks. Kami boleh menentukan indeks kompaun pada medan post_type dan post_lik seperti berikut:
Menganalisis pertanyaan sekarang memberikan hasil berikut:
Titik nota yang sangat penting di sini ialah indeks kompaun yang ditakrifkan pada pelbagai bidang boleh digunakan untuk menanyakan subset bidang ini. Sebagai contoh, katakan terdapat indeks kompaun {field1, field2, field3}. Indeks ini boleh digunakan untuk menanyakan:
field1
field1, field2 -
field1, field2, field3 -
Jadi, jika kita telah menentukan indeks {field1, field2, field3}, kita tidak perlu menentukan indeks berasingan {field1} dan {field1, field2}. Walau bagaimanapun, jika kita memerlukan indeks kompaun ini semasa pertanyaan Field2 dan Field2, Field3, kita boleh menggunakan petunjuk () jika pengoptimum tidak memilih indeks yang dikehendaki.
Kaedah petunjuk () boleh digunakan untuk memaksa MongoDB untuk menggunakan indeks yang kami tentukan dan mengatasi proses pemilihan lalai dan pengoptimuman pertanyaan. Anda boleh menentukan nama medan yang digunakan dalam indeks sebagai hujah seperti yang ditunjukkan di bawah:
-
Ini memastikan pertanyaan menggunakan indeks kompaun yang ditakrifkan pada medan post_type dan post_likes.
indeks multikey
Apabila pengindeksan dilakukan pada medan array, ia dipanggil indeks multikey. Pertimbangkan dokumen pos kami sekali lagi; Kita boleh memohon indeks multikey pada post_tags. Indeks multikey akan mengindeks setiap elemen array, jadi dalam hal ini indeks berasingan akan dibuat untuk nilai post_tags:
<span><span><?php
</span></span><span><span>// query to find posts with user_name "Jim Alexandar"
</span></span><span><span>$cursor = $collection->find(
</span></span><span> <span>array("user_name" => "Jim Alexandar")
</span></span><span><span>);
</span></span><span><span>// use explain() to get explanation of query indexes
</span></span><span><span>var_dump($cursor->explain());</span></span>
Salin selepas log masuk
mongoDB
,
tutorial
, pengindeksan
, dan Jadi pada.
Indeks pada medan array mesti digunakan dengan sangat terpilih, walaupun, kerana mereka mengambil banyak ingatan kerana pengindeksan setiap nilai.
Indeks kompaun multikey
Kita boleh membuat indeks kompaun multikey, tetapi dengan batasan yang paling banyak satu bidang dalam indeks boleh menjadi array. Jadi, jika kita mempunyai Field1 sebagai rentetan, dan [Field2, Field3] sebagai array, kita tidak dapat menentukan indeks {field2, field3} kerana kedua -dua bidang adalah tatasusunan.
Dalam contoh di bawah, kami membuat indeks pada medan post_tags dan user_name:
Batasan dan Pertimbangan Pengindeksan
Adalah penting untuk mengetahui bahawa pengindeksan tidak boleh digunakan dalam pertanyaan yang menggunakan ungkapan biasa, pengendali penolakan (iaitu $ ne, $ tidak, dll), pengendali aritmetik (iaitu $ mod, dll.), Ungkapan JavaScript di $ di mana Fasal, dan dalam beberapa kes lain.
Operasi pengindeksan juga datang dengan kos mereka sendiri. Setiap indeks menduduki ruang serta menyebabkan overhead tambahan pada setiap memasukkan, mengemas kini, dan memadam operasi pada koleksi. Anda perlu mempertimbangkan nisbah baca: tulis untuk setiap koleksi; Pengindeksan memberi manfaat kepada koleksi baca-berat, tetapi mungkin bukan untuk koleksi bertulis-berat.
MongoDB menyimpan indeks dalam RAM. Pastikan saiz indeks keseluruhan tidak melebihi had RAM. Sekiranya ia berlaku, beberapa indeks akan dikeluarkan dari RAM dan oleh itu pertanyaan akan melambatkan. Juga, koleksi boleh mempunyai maksimum 64 indeks.
Ringkasan
Itu sahaja untuk bahagian ini. Untuk meringkaskan, indeks sangat bermanfaat untuk aplikasi jika pendekatan pengindeksan yang betul dipilih. Di bahagian seterusnya, kami akan melihat menggunakan indeks pada dokumen tertanam, sub-dokumen, dan pesanan. Tinggal!
imej melalui Fotolia
soalan yang sering ditanya mengenai pengindeksan mongoDB
Apakah kepentingan pengindeksan MongoDB dalam pengurusan pangkalan data? Ia secara signifikan meningkatkan prestasi operasi pangkalan data dengan menyediakan laluan yang lebih efisien kepada data. Tanpa indeks, MongoDB mesti melakukan imbasan koleksi, iaitu, mengimbas setiap dokumen dalam koleksi, untuk memilih dokumen -dokumen yang sepadan dengan pernyataan pertanyaan. Dengan indeks, MongoDB boleh mengehadkan pencariannya ke bahagian data yang berkaitan, dengan itu mengurangkan jumlah data yang diperlukan untuk mengimbas. Ini menghasilkan masa tindak balas pertanyaan yang lebih cepat dan penggunaan CPU yang lebih rendah, yang sangat bermanfaat dalam pangkalan data yang besar.
Bagaimanakah pengindeksan MongoDB berfungsi?
Pengindeksan MongoDB berfungsi dengan mewujudkan struktur data khas yang memegang sebahagian kecil daripada data pengumpulan. Struktur data ini merangkumi nilai medan tertentu atau set medan, yang diperintahkan oleh nilai medan seperti yang dinyatakan dalam indeks. Apabila pertanyaan dilaksanakan, MongoDB menggunakan indeks ini untuk mengehadkan bilangan dokumen yang mesti diperiksa. Indeks sangat bermanfaat apabila jumlah saiz dokumen melebihi RAM yang ada. prestasi pertanyaan anda. Ini termasuk medan tunggal, kompaun, multikey, teks, 2D, dan indeks 2dsphere. Setiap jenis indeks berfungsi dengan tujuan tertentu dan digunakan untuk pelbagai jenis pertanyaan. Sebagai contoh, medan tunggal dan indeks kompaun digunakan untuk pertanyaan pada medan tunggal atau berganda. Indeks multikey digunakan untuk tatasusunan, dan indeks teks digunakan untuk kandungan rentetan.
Bagaimana saya membuat indeks dalam mongoDB? . Kaedah ini mewujudkan indeks pada medan yang ditentukan jika indeks belum wujud. Kaedah ini mengambil dua parameter: medan atau medan untuk indeks dan dokumen pilihan yang membolehkan anda menentukan pilihan tambahan. Indeks di MongoDB. Walau bagaimanapun, penting untuk diperhatikan bahawa walaupun indeks meningkatkan prestasi pertanyaan, mereka juga menggunakan sumber sistem, terutamanya ruang cakera dan ingatan. Oleh itu, adalah penting untuk membuat indeks dengan bijak dan hanya pada bidang -bidang yang akan sering ditanya. MongoDB sebahagian besarnya bergantung pada corak pertanyaan aplikasi anda. Bidang yang sering ditanya atau digunakan dalam operasi jenis adalah calon yang baik untuk pengindeksan. Di samping itu, bidang dengan keunikan yang tinggi juga merupakan calon yang baik untuk mengindeks kerana mereka dapat mengurangkan jumlah dokumen yang perlu diimbas oleh MongoDB ketika melaksanakan pertanyaan.
Anda boleh menyemak sama ada indeks wujud dalam mongoDB menggunakan kaedah getIndexes (). Kaedah ini mengembalikan senarai semua indeks pada koleksi, termasuk indeks _id yang dibuat secara lalai. MongoDB menggunakan kaedah dropIndex (). Kaedah ini menghilangkan indeks yang ditentukan dari koleksi. . Ini boleh menjadi sangat berguna apabila tidak ada indeks tunggal yang dapat memenuhi pertanyaan, tetapi persimpangan dua atau lebih indeks boleh.
Apakah kesan pengindeksan pada operasi menulis di MongoDB? Ini kerana setiap kali dokumen dimasukkan atau dikemas kini, semua indeks pada koleksi juga mesti dikemas kini. Oleh itu, lebih banyak indeks koleksi mempunyai, semakin perlahan operasi menulis. Adalah penting untuk mencari keseimbangan antara prestasi membaca dan menulis prestasi semasa membuat indeks.
Atas ialah kandungan terperinci PHP Master | Pengindeksan MongoDB, Bahagian 1. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!