Rumah > Soal Jawab > teks badan
Saya menghadapi masalah MongoDB dalam projek, dan saya masih belum dapat menyelesaikannya selepas beberapa hari saya berharap untuk mendapatkan nasihat daripada pakar.
Masalah khusus ialah: apabila pangkalan data tidak diakses untuk masa yang lama, pertanyaan pertama pangkalan data mengambil masa yang lama, tetapi pertanyaan seterusnya akan menjadi sangat pantas.
Butiran:
①整个数据库大小大概在1.9TB左右;
②我查询的collection的数据大致为700万条;
③我查询一次得到的数据为23万条左右;
④服务器内存为120GB;
⑤已按照查询条件建立了索引,索引数据大小为600MB左右;
⑥第一次查询所用时间20s左右,之后的查询在1s以内。
Sebab yang sedang dipertimbangkan:
由于MongoDB不负责内存的管理,所以,当长时间未访问数据库时,内存中的数据即为冷数据,操作系统的内存管理程序就会将这部分冷数据释放,导致下次查询时,需要重新加载数据到内存,所以比较费时。目前,不能够确定是加载索引比较费时,还是加载数据比较费时。MongoDB虽然提供了touch命令(该命令能够指定将某个collection的索引数据或者用户数据加载到内存中),但是我使用的是WiredTiger存储引擎,该命令不支持该存储引擎。
Bantuan diperlukan:
①是不是以上原因导致的该问题?
②如果是该原因导致的,如何确定是加载索引费时还是加载数据费时?
③有什么比较好的解决方案么?
注:由于该collection最大会达到25GB左右,而且整个数据库还有其他很多collection,所以将该collection的所有数据存储到内存是不可取的。如果能够确认是加载索引费时的话,倒是可以考虑定期将索引加载到内存,但是对于WiredTiger存储引擎,没有支持该功能的方法,这又是一个问题。
phpcn_u15822017-05-02 09:28:08
Masalah yang anda nyatakan adalah berkaitan dengan set kerja.
1. Apakah set kerja?
Konsep penting dalam pengurusan ingatan MongoDB. Dalam pengurusan ingatan, cuba letak set data yang kerap diakses dan indeks berkaitan dalam ingatan.
2. Bagaimana untuk meletakkan set kerja dalam ingatan?
Dalam pernyataan anda, ia sebenarnya bermakna set kerja perlu dipanaskan dan diletakkan dalam ingatan terlebih dahulu (Pramuat atau Prapemanasan). Bagaimana untuk melakukannya secara khusus? Anda menyebut sentuhan (enjin MMAP), jadi bagaimana untuk melaksanakannya dalam versi berikutnya (enjin WT)?
Jika ia adalah pangkalan data hubungan, kaedah yang sering digunakan ialah pilih * Berkali-kali semasa melakukan ujian prestasi, untuk mencapai hasil yang baik, sekumpulan pernyataan Pilih akan dijalankan terlebih dahulu untuk memanaskan memori.
Dalam MongoDB, pertimbangkan:
1) Jika indeks dilindungi boleh digunakan terus dalam pertanyaan perniagaan, atau apabila indeks perlu dipanaskan:
db.collection.find({}, {"_id" : 0, "field_a" : 1, "field_b" : 1}).hint({"field_a" : 1, "field_b" : 1}). terangkan()
2) Apabila anda perlu memanaskan set kerja, premisnya ialah anda mengetahui data dalam koleksi anda yang perlu diakses dengan kerap, biasanya dalam tempoh masa tertentu, dan kemudian menggunakan kaedah yang sama seperti di atas untuk pengumpulan dalam ini tempoh masa untuk memanaskan badan.
Perbezaannya ialah: memanaskan indeks memanaskan semua indeks, jadi keadaan pertanyaan ialah {}, manakala memanaskan set kerja hanya memanaskan bahagian tertentu data dalam koleksi, jadi keadaan pertanyaan mungkin Syarat yang berkaitan dengan masa julat.
Untuk rujukan.
Sayangi MongoDB! Selamat mencuba!
Persidangan Pengguna Shenzhen Komuniti Cina MongoDB
Jom buat temu janji Sabtu ini
Sila masukkan untuk butiran