MongoDB tidak secara ajaib lebih cepat. Jika Anda menyimpan data yang sama, pada dasarnya diatur dengan cara yang sama, dan mengaksesnya dengan cara yang persis sama, maka Anda seharusnya tidak mengharapkan hasil yang sangat berbeda. Bagaimanapun juga, MySQL dan MongoDB adalah GPL, jadi jika Mongo memiliki beberapa kode IO yang lebih baik di dalamnya, maka tim MySQL dapat memasukkannya ke dalam basis kode mereka.
Orang-orang melihat kinerja MongoDB dunia nyata sebagian besar karena MongoDB memungkinkan Anda untuk membuat kueri dengan cara berbeda yang lebih sesuai dengan beban kerja Anda.
Misalnya, pertimbangkan desain yang menyimpan banyak informasi tentang entitas yang rumit dengan cara yang dinormalisasi. Ini dapat dengan mudah menggunakan lusinan tabel di MySQL (atau db relasional apa pun) untuk menyimpan data dalam bentuk normal, dengan banyak indeks yang diperlukan untuk memastikan integritas relasional antar tabel.
Sekarang pertimbangkan desain yang sama dengan toko dokumen. Jika semua tabel terkait tersebut berada di bawah tabel utama (dan seringkali demikian), maka Anda mungkin dapat memodelkan data sedemikian rupa sehingga seluruh entitas disimpan dalam satu dokumen. Di MongoDB Anda dapat menyimpan ini sebagai satu dokumen, dalam satu koleksi. Di sinilah MongoDB mulai memungkinkan kinerja yang unggul.
Di MongoDB, untuk mengambil seluruh entitas, Anda harus melakukan:
- Satu pencarian indeks pada koleksi (dengan asumsi entitas diambil dengan id)
- Ambil isi dari satu halaman database (dokumen json biner yang sebenarnya)
Jadi pencarian b-tree, dan halaman biner dibaca. Log(n) + 1 IO. Jika indeks dapat berada seluruhnya di memori, maka 1 IO.
Di MySQL dengan 20 tabel, Anda harus melakukan:
- Satu pencarian indeks pada tabel root (sekali lagi, dengan asumsi entitas diambil oleh id)
- Dengan indeks berkerumun, kita dapat mengasumsikan bahwa nilai untuk baris akar berada dalam indeks
- 20+ pencarian rentang (semoga pada indeks) untuk nilai pk entitas
- Ini mungkin bukan indeks berkerumun, jadi 20+ pencarian data yang sama setelah kami mengetahui baris turunan yang sesuai.
Jadi total untuk mysql, bahkan dengan asumsi bahwa semua indeks ada di memori (yang lebih sulit karena ada 20 kali lebih banyak) adalah sekitar 20 pencarian rentang.
Pencarian rentang ini kemungkinan terdiri dari IO acak — tabel yang berbeda pasti akan berada di tempat yang berbeda pada disk, dan mungkin saja baris yang berbeda dalam rentang yang sama dalam tabel yang sama untuk suatu entitas mungkin tidak bersebelahan (bergantung pada bagaimana entitas telah diperbarui, dll).
Jadi untuk contoh ini, penghitungan akhir adalah sekitar 20 kali lebih banyak IO dengan MySQL per akses logis, dibandingkan dengan MongoDB.
Beginilah cara MongoDB dapat meningkatkan kinerja dalam beberapa kasus penggunaan .