MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Mengapa sisipan lambat di shell 2.6 MongoDB dibandingkan dengan versi sebelumnya?

Sebelum 2.6 shell interaktif akan berjalan melalui loop dan hanya memeriksa keberhasilan (menggunakan getLastError) dari operasi terakhir dalam loop (lebih khusus, itu disebut getLastError setelah setiap carriage return, dengan operasi terakhir menjadi penyisipan terakhir dalam loop). Dengan 2.6, shell sekarang akan memeriksa status setiap operasi individu dalam loop. Pada dasarnya itu berarti bahwa "kelambatan" dengan 2,6 dapat dikaitkan dengan kinerja tulis yang diakui versus tidak diakui, bukan masalah kinerja yang sebenarnya.

Penulisan yang diakui telah menjadi default untuk beberapa waktu sekarang , jadi menurut saya perilaku di 2.6 lebih benar, meskipun sedikit merepotkan bagi kita yang terbiasa dengan perilaku aslinya.

Untuk kembali ke tingkat kinerja sebelumnya, jawabannya adalah dengan menggunakan API penyisipan massal tidak berurutan . Ini versi waktunya:

> db.timecheck.drop();
true
> var bulk = db.timecheck.initializeUnorderedBulkOp(); start = new Date(); for(var i = 0; i < 100000; i++){bulk.insert({"_id" : i})}; bulk.execute({w:1}); end = new Date(); print(end - start);
2246

Itu sekarang kembali ke kinerja yang pada dasarnya sama hanya dalam waktu 2 detik. Tentu, ini sedikit lebih besar (maafkan permainan kata), tetapi Anda tahu persis apa yang Anda dapatkan, yang menurut saya adalah hal yang baik secara umum. Ada juga keuntungan di sini, ketika Anda tidak mencari informasi waktu. Mari singkirkan itu dan jalankan insert lagi:

> db.timecheck.drop();
true
> var bulk = db.timecheck.initializeUnorderedBulkOp(); for(var i = 0; i < 100000; i++){bulk.insert({"_id" : i})}; bulk.execute({w:1});
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 100000,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})

Sekarang kami mendapatkan dokumen hasil yang bagus ketika kami melakukan penyisipan massal, daripada pemeriksaan hanya pada operasi terakhir (semua sisanya dalam versi 2.4 pada dasarnya mengirim dan melupakan). Karena ini adalah operasi massal yang tidak diurutkan, ini akan terus berlanjut jika menemukan kesalahan dan melaporkan setiap kesalahan tersebut dalam dokumen ini. Tidak ada yang terlihat dalam contoh di atas, tetapi mudah untuk membuat skenario kegagalan secara artifisial. Mari kita masukkan terlebih dahulu nilai yang kita tahu akan muncul dan karenanya menyebabkan kesalahan kunci duplikat pada indeks _id unik (default):

> db.timecheck.drop();
true
> db.timecheck.insert({_id : 500})
WriteResult({ "nInserted" : 1 })
> var bulk = db.timecheck.initializeUnorderedBulkOp(); for(var i = 0; i < 100000; i++){bulk.insert({"_id" : i})}; bulk.execute({w:1});
2014-03-28T16:19:40.923+0000 BulkWriteError({
"writeErrors" : [
{
"index" : 500,
"code" : 11000,
"errmsg" : "insertDocument :: caused by :: 11000 E11000 duplicate key error index: test.timecheck.$_id_ dup key: { : 500.0 }",
"op" : {
"_id" : 500
}
}
],
"writeConcernErrors" : [ ],
"nInserted" : 99999,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})

Sekarang kita bisa melihat berapa banyak yang berhasil, mana yang gagal (dan mengapa). Mungkin sedikit lebih rumit untuk disiapkan, tetapi secara keseluruhan menurut saya ini adalah peningkatan.

Dengan semua itu, dan cara baru yang disukai diuraikan, ada cara untuk memaksa Shell kembali ke mode lama. Ini masuk akal, karena shell 2.6 mungkin harus terhubung ke, dan bekerja dengan, server yang lebih lama. Jika Anda terhubung ke server 2.4, ini akan diurus untuk Anda, tetapi untuk memaksakan masalah untuk koneksi tertentu, Anda dapat menjalankan:

db.getMongo().forceWriteMode("legacy");

Setelah selesai, Anda dapat kembali ke versi 2.6 dengan:

db1.getMongo().forceWriteMode("commands");

Untuk penggunaan sebenarnya, lihat cuplikan crud.js . Ini berfungsi untuk saat ini, tetapi dapat dihapus tanpa pemberitahuan kapan pun di masa mendatang dan benar-benar tidak dimaksudkan untuk penggunaan ekstensif, jadi gunakan dengan risiko Anda sendiri.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoError:Topologi ditutup, harap sambungkan tampaknya terkait dengan MongoClient.close() dan klien tidak akan berfungsi saat menggunakannya

  2. Pencarian agregasi Mongo 3.6 dengan beberapa kondisi

  3. Seberapa cepat Redis daripada mongoDB?

  4. Kesalahan pemilihan server Docker dan mongo-go-driver

  5. luwak:mendeteksi jika dokumen yang dimasukkan adalah duplikat dan jika demikian, kembalikan dokumen yang ada