Saya sangat senang tentang MongoDb dan telah mengujinya akhir-akhir ini. Saya memiliki tabel yang disebut posting di MySQL dengan sekitar 20 juta catatan diindeks hanya pada bidang yang disebut 'id'.
Saya ingin membandingkan kecepatan dengan MongoDB dan saya menjalankan tes yang akan mendapatkan dan mencetak 15 catatan secara acak dari database besar kami. Saya menjalankan kueri masing-masing sekitar 1.000 kali untuk mysql dan MongoDB dan saya terkejut bahwa saya tidak melihat banyak perbedaan dalam kecepatan. Mungkin MongoDB adalah 1,1 kali lebih cepat. Itu sangat mengecewakan. Apakah ada yang salah yang saya lakukan? Saya tahu bahwa tes saya tidak sempurna tetapi MySQL setara dengan MongoDb ketika datang untuk membaca tugas-tugas intensif.
catatan:
- Saya memiliki dual core + (2 thread) i7 cpu dan ram 4GB
- Saya memiliki 20 partisi di MySQL masing-masing dari 1 juta catatan
Kode Sampel Digunakan Untuk Menguji MongoDB
<?php
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$time_taken = 0;
$tries = 100;
// connect
$time_start = microtime_float();
for($i=1;$i<=$tries;$i++)
{
$m = new Mongo();
$db = $m->swalif;
$cursor = $db->posts->find(array('id' => array('$in' => get_15_random_numbers())));
foreach ($cursor as $obj)
{
//echo $obj["thread_title"] . "<br><Br>";
}
}
$time_end = microtime_float();
$time_taken = $time_taken + ($time_end - $time_start);
echo $time_taken;
function get_15_random_numbers()
{
$numbers = array();
for($i=1;$i<=15;$i++)
{
$numbers[] = mt_rand(1, 20000000) ;
}
return $numbers;
}
?>
Contoh Kode Untuk Menguji MySQL
<?php
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$BASE_PATH = "../src/";
include_once($BASE_PATH . "classes/forumdb.php");
$time_taken = 0;
$tries = 100;
$time_start = microtime_float();
for($i=1;$i<=$tries;$i++)
{
$db = new AQLDatabase();
$sql = "select * from posts_really_big where id in (".implode(',',get_15_random_numbers()).")";
$result = $db->executeSQL($sql);
while ($row = mysql_fetch_array($result) )
{
//echo $row["thread_title"] . "<br><Br>";
}
}
$time_end = microtime_float();
$time_taken = $time_taken + ($time_end - $time_start);
echo $time_taken;
function get_15_random_numbers()
{
$numbers = array();
for($i=1;$i<=15;$i++)
{
$numbers[] = mt_rand(1, 20000000);
}
return $numbers;
}
?>
sumber
Jawaban:
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 benar-benar tidak boleh mengharapkan hasil Anda sangat berbeda. Bagaimanapun, MySQL dan MongoDB keduanya adalah GPL, jadi jika Mongo memiliki beberapa kode IO yang secara ajaib lebih baik di dalamnya, maka tim MySQL bisa memasukkannya ke dalam basis kode mereka.
Orang-orang melihat kinerja MongoDB dunia nyata sebagian besar karena MongoDB memungkinkan Anda melakukan kueri dengan cara berbeda yang lebih masuk akal untuk beban kerja Anda.
Misalnya, pertimbangkan desain yang menyimpan banyak informasi tentang entitas yang rumit dengan cara yang dinormalisasi. Ini bisa dengan mudah menggunakan lusinan tabel di MySQL (atau relasional db) untuk menyimpan data dalam bentuk normal, dengan banyak indeks diperlukan untuk memastikan integritas relasional antar tabel.
Sekarang pertimbangkan desain yang sama dengan toko dokumen. Jika semua tabel terkait berada di bawah tabel utama (dan memang sering terjadi), maka Anda mungkin dapat memodelkan data sedemikian rupa sehingga seluruh entitas disimpan dalam satu dokumen. Di MongoDB Anda dapat menyimpan ini sebagai dokumen tunggal, dalam satu koleksi. Di sinilah MongoDB mulai mengaktifkan kinerja yang unggul.
Di MongoDB, untuk mengambil seluruh entitas, Anda harus melakukan:
Jadi pencarian b-tree, dan halaman biner membaca. Log (n) + 1 IO. Jika indeks dapat berada sepenuhnya dalam memori, maka 1 IO.
Di MySQL dengan 20 tabel, Anda harus melakukan:
Jadi total untuk mysql, bahkan dengan asumsi bahwa semua indeks ada dalam memori (yang lebih sulit karena ada 20 kali lebih banyak dari mereka) adalah sekitar 20 rentang pencarian.
Pencarian rentang ini kemungkinan terdiri dari IO acak - tabel yang berbeda pasti akan berada di tempat yang berbeda pada disk, dan mungkin baris berbeda dalam rentang yang sama dalam tabel yang sama untuk suatu entitas mungkin tidak berdekatan (tergantung 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.
Inilah bagaimana MongoDB dapat meningkatkan kinerja dalam beberapa kasus penggunaan .
sumber
Apakah Anda memiliki konkurensi, yaitu pengguna simultan? Jika Anda hanya menjalankan 1000 kali kueri langsung, hanya dengan satu utas, hampir tidak ada perbedaan. Terlalu mudah untuk mesin ini :)
TETAPI saya sangat menyarankan Anda membangun sesi pengujian beban yang sebenarnya, yang berarti menggunakan injector seperti JMeter dengan 10, 20 atau 50 pengguna PADA SAAT YANG SAMA sehingga Anda benar-benar dapat melihat perbedaan (cobalah untuk menanamkan kode ini di dalam halaman web JMeter dapat meminta).
Saya baru saja melakukannya hari ini di satu server (dan koleksi / tabel sederhana) dan hasilnya cukup menarik dan mengejutkan (MongoDb benar-benar lebih cepat dalam menulis & membaca, dibandingkan dengan mesin MyISAM dan mesin InnoDb).
Ini benar-benar harus menjadi bagian dari pengujian Anda: concurrency & mesin MySQL. Kemudian, desain data / skema & kebutuhan aplikasi tentu saja persyaratan yang sangat besar, di luar waktu respons. Beri tahu saya ketika Anda mendapatkan hasil, saya juga membutuhkan masukan tentang ini!
sumber
Sumber: https://github.com/webcaetano/mongo-mysql
10 baris
100 baris
1000 baris
10.000 baris
sumber
man ,,, jawabannya adalah bahwa Anda pada dasarnya menguji PHP dan bukan database.
jangan repot-repot mengulangi hasilnya, apakah mengomentari hasil cetak atau tidak. ada banyak waktu.
sementara potongan lainnya dihabiskan untuk mengumpulkan banyak nomor rand.
maka ada perbedaan besar b / w meledak dan
dan akhirnya apa yang terjadi di sini. sepertinya membuat koneksi setiap kali, jadi ini menguji waktu koneksi ditambah waktu permintaan.
vs.
jadi 101% Anda lebih cepat bisa berubah menjadi 1000% lebih cepat untuk kueri jazz yang mendasarinya.
urghhh
sumber
https://github.com/reoxey/benchmark
patokan
perbandingan kecepatan MySQL & MongoDB di GOLANG1.6 & PHP5
sistem yang digunakan untuk benchmark: DELL cpu i5 4th gen 1.70Ghz * 4 ram 4GB GPU ram 2GB
Perbandingan kecepatan RDBMS vs NoSQL untuk INSERT, SELECT, UPDATE, DELETE yang mengeksekusi jumlah baris yang berbeda 10.100,1000,10000,100000,100000000
Bahasa yang digunakan untuk mengeksekusi adalah: PHP5 & Google tercepat bahasa GO 1.6
sumber
Berikut adalah sedikit riset yang mengeksplorasi RDBMS vs NoSQL menggunakan MySQL vs Mongo, kesimpulannya sejalan dengan tanggapan @Sean Reilly. Singkatnya, manfaat berasal dari desain, bukan perbedaan kecepatan mentah. Kesimpulan di halaman 35-36:
RDBMS vs NoSQL: Perbandingan Kinerja dan Skala
sumber
Pada Server Tunggal, MongoDb tidak akan lebih cepat dari mysql MyISAM pada saat membaca dan menulis, mengingat ukuran tabel / dokumen kecil 1 GB hingga 20 GB.
MonoDB akan lebih cepat pada Reduksi Paralel pada kluster Multi-Node, di mana Mysql TIDAK dapat skala secara horizontal.
sumber