Mengisih set data yang besar dalam MongoDB kadangkala boleh menyebabkan ranap ingatan yang mengecewakan. Tetapi jangan risau — saya mempunyai beberapa petua mudah untuk membantu anda mengelakkan perkara itu! Sebelum kita menyelam, saya telah menulis artikel lain tentang menggunakan Perancang Pertanyaan MongoDB untuk menyemak sama ada pertanyaan anda cekap. Ini cara yang bagus untuk melihat apa yang sebenarnya berlaku di bawah hud dan mengatasi masalah lebih awal.
Apabila anda mengisih sebahagian besar data, MongoDB cuba memuatkan semuanya ke dalam memori. Jika set data terlalu besar, ia mungkin kehabisan memori dan ranap sistem. Begini cara anda boleh mengelakkan perkara itu dan memastikan pertanyaan anda berjalan lancar.
Contoh:
db.users.createIndex({ createdAt: 1 });
Output Perancang Pertanyaan:
{ "stage": "FETCH", "inputStage": { "stage": "IXSCAN", "keyPattern": { "createdAt": 1 } } }
Di sini anda boleh melihat MongoDB menggunakan imbasan indeks (IXSCAN), bermakna ia pintar dan cekap!
Contoh:
db.users.find().sort({ createdAt: 1 });
Output Perancang Pertanyaan:
{ "stage": "FETCH", "inputStage": { "stage": "IXSCAN", "keyPattern": { "createdAt": 1 } } }
Bagus! MongoDB menggunakan indeks dengan betul, jadi ia tidak mengganggu sistem anda.
Contoh:
db.users.find().sort({ createdAt: 1 }).limit(100).skip(0);
Output Perancang Pertanyaan:
{ "stage": "LIMIT", "inputStage": { "stage": "IXSCAN", "keyPattern": { "createdAt": 1 } } }
MongoDB menjadi pintar di sini dengan mengehadkan set hasil, jadi ia hanya mengambil apa yang anda perlukan sekarang.
Contoh:
db.users.aggregate([{ $sort: { createdAt: 1 } }], { allowDiskUse: true });
Output Perancang Pertanyaan:
{ "stage": "SORT", "diskUsed": true, "inputStage": { "stage": "COLLSCAN" } }
MongoDB kini menggunakan ruang cakera untuk membantu dengan pengisihan. Jika anda menggunakan rancangan yang lebih berkuasa, ini boleh menjadi cara terbaik untuk mengelakkan ranap memori.
Berikut ialah petua untuk memastikan perkara berjalan lancar: jika anda melakukan apa-apa pada medan yang anda cuba isih mengikut (seperti menukarnya, menambah sesuatu padanya atau melaraskannya) dalam saluran pengagregatan , MongoDB akan menggugurkan indeks. Setelah indeks digugurkan, MongoDB tidak boleh menggunakannya untuk membantu mengisih, yang bermaksud pertanyaan anda akan menjadi lebih perlahan dan menggunakan lebih banyak memori.
Sebagai contoh, katakan anda mahu mengisih pengguna mengikut tahun mereka mendaftar. Jika anda melakukan sesuatu seperti ini:
db.users.aggregate([ { $project: { year: { $year: "$createdAt" } } }, { $sort: { year: 1 } } ]);
Oleh kerana anda menukar medan createAt kepada setahun, MongoDB menurunkan indeks pada createdAt. Kini ia perlu mengimbas seluruh koleksi untuk mengisih data, yang boleh melambatkan banyak perkara.
Semoga petua ini memastikan MongoDB anda berjalan lancar! Jika anda mempunyai soalan, sila hubungi. Selamat mengekod! ?
Atas ialah kandungan terperinci Mencegah Ranap Habis Memori dalam Pengisihan MongoDB: Strategi Pengoptimuman Berkesan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!