MySQL กับ MongoDB 1,000 อ่าน


320

ฉันตื่นเต้นเป็นอย่างมากกับ MongoDb และได้ทำการทดสอบเมื่อไม่นานมานี้ ฉันมีตารางที่เรียกว่าโพสต์ใน MySQL ที่มีประมาณ 20 ล้านบันทึกการจัดทำดัชนีเฉพาะในเขตข้อมูลที่เรียกว่า 'id'

ฉันต้องการเปรียบเทียบความเร็วกับ MongoDB และฉันทดสอบซึ่งจะได้รับและพิมพ์ 15 รายการแบบสุ่มจากฐานข้อมูลขนาดใหญ่ของเรา ฉันใช้แบบสอบถามประมาณ 1,000 ครั้งสำหรับ mysql และ MongoDB และฉันประหลาดใจที่ฉันไม่ได้สังเกตเห็นความแตกต่างของความเร็ว บางที MongoDB อาจเร็วขึ้น 1.1 เท่า มันน่าผิดหวังมาก มีบางอย่างที่ฉันทำผิดหรือเปล่า? ฉันรู้ว่าการทดสอบของฉันไม่สมบูรณ์แบบ แต่ MySQL นั้นเทียบเท่ากับ MongoDb เมื่อพูดถึงการอ่านงานบ้านที่เข้มข้น


บันทึก:

  • ฉันมี dual core + (2 กระทู้) i7 cpu และ 4GB ram
  • ฉันมีพาร์ติชั่นบน MySQL จำนวน 20 พาร์ทิชั่นหนึ่งล้านเรคคอร์ด

โค้ดตัวอย่างที่ใช้สำหรับการทดสอบ 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;
}

?>


โค้ดตัวอย่างสำหรับการทดสอบ 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;
}
?>

11
เวลาที่แท้จริงคืออะไร
Abe Petrillo

30
ฉันไม่ใช่ DBA ดังนั้นนี่คือความคิดเห็นไม่ใช่คำตอบ แต่ความเร็วไม่ควรพิจารณาหลักเมื่อเลือกระหว่าง MySQL และ MongoDB สิ่งต่าง ๆ เช่น schemaless vs. schema (เช่นสคีมาข้อมูลของคุณจำเป็นต้องเปลี่ยนบ่อยแค่ไหน) และการปรับขนาด (เช่นความง่ายในการตัดข้อมูลของคุณเพื่อให้การอ่านทั่วไปต้องการข้อมูลจากเซิร์ฟเวอร์เพียงเครื่องเดียว) มีความสำคัญมากกว่าทางเลือก แบบนี้.
rossdavidh

17
การอ่านเร็วขึ้นได้อย่างไร? มันอ่านได้จากอุปกรณ์เชิงกล เช่นเดียวกับ MySQL ขึ้นอยู่กับความเร็วของอุปกรณ์คุณไม่สามารถใช้เวทย์มนตร์แปลก ๆ ผ่านโค้ดเพื่อทำลายขีด จำกัด ของฮาร์ดแวร์
NB

7
คำถามนี้ทำให้ฉันนึกถึงสิ่งนี้: mongodb-is-web-scale.com
oligofren

13
ผู้คนเข้าใจผิดว่าพวกเขารู้สึกว่าพวกเขาจะไปด้วยอย่างใดอย่างหนึ่ง คุณจะต้องมีทั้งไมโครเวฟและเตาอบในครัวของคุณ คุณไม่สามารถพูดได้ว่าฉันจะใช้อย่างใดอย่างหนึ่งเท่านั้น ใช้เคสสำหรับทั้งสองระบบจะแตกต่างกัน หากคุณต้องการ ACID สำหรับส่วนหนึ่งของแอพของคุณให้ใช้ RDBMS ถ้าไม่สนใจเรื่องความสอดคล้องและข้อ จำกัด และเอนทิตีของคุณสามารถจัดเก็บได้ทั้งหมดในที่เดียว (คอลเลกชัน) จากนั้นใช้ MongoDB คุณจะจบลงด้วยการใช้ระบบไฮบริดจุดสำคัญคือการตัดสินใจว่าจะเก็บที่ไหน
Teoman shipahi

คำตอบ:


646

MongoDB ไม่เร็วอย่างน่าอัศจรรย์ หากคุณจัดเก็บข้อมูลเดียวกันจัดระเบียบในแบบเดียวกันและเข้าถึงข้อมูลแบบเดียวกันคุณก็ไม่ควรคาดหวังผลลัพธ์ของคุณจะแตกต่างกันอย่างสิ้นเชิง ท้ายที่สุด, MySQL และ MongoDB เป็นทั้ง GPL, ดังนั้นหาก Mongo มีโค้ด IO ที่ดีกว่าอย่างน่าอัศจรรย์, จากนั้นทีม MySQL สามารถรวมมันเข้าไปใน codebase ของพวกเขาได้

ผู้คนกำลังมองเห็นประสิทธิภาพของ MongoDB ในโลกแห่งความเป็นจริงเพราะ MongoDB ช่วยให้คุณสามารถค้นหาในลักษณะที่แตกต่างกันซึ่งเหมาะสมกับภาระงานของคุณมากขึ้น

ตัวอย่างเช่นพิจารณาการออกแบบที่ยืนยันข้อมูลจำนวนมากเกี่ยวกับเอนทิตีที่ซับซ้อนในแบบปกติ สิ่งนี้สามารถใช้ตารางจำนวนมากใน MySQL (หรือฐานข้อมูลเชิงสัมพันธ์ใด ๆ ) ได้อย่างง่ายดายเพื่อจัดเก็บข้อมูลในรูปแบบปกติโดยมีดัชนีจำนวนมากที่จำเป็นในการรับรองความสมบูรณ์ของความสัมพันธ์ระหว่างตาราง

พิจารณาการออกแบบเดียวกันกับที่เก็บเอกสาร หากตารางที่เกี่ยวข้องเหล่านั้นทั้งหมดอยู่ในตารางรอง (และมักจะเป็น) คุณอาจสามารถสร้างแบบจำลองข้อมูลเช่นที่เอนทิตีทั้งหมดถูกเก็บไว้ในเอกสารเดียว ใน MongoDB คุณสามารถเก็บสิ่งนี้เป็นเอกสารเดียวได้ในคอลเล็กชันเดียว นี่คือที่ MongoDB เริ่มเปิดใช้งานประสิทธิภาพที่เหนือกว่า

ใน MongoDB เพื่อดึงเอนทิตีทั้งหมดคุณต้องดำเนินการ:

  • การค้นหาดัชนีหนึ่งครั้งบนคอลเลกชัน (สมมติว่าเอนทิตีถูกดึงมาด้วย id)
  • ดึงเนื้อหาของหน้าฐานข้อมูลเดียว (เอกสารไบนารี json จริง)

ดังนั้นการค้นหา b-tree และการอ่านหน้าไบนารี บันทึก (n) + 1 IOs หากดัชนีสามารถอยู่ในหน่วยความจำทั้งหมดได้ดังนั้น 1 IO

ใน MySQL มี 20 ตารางคุณต้องดำเนินการ:

  • การค้นหาดัชนีหนึ่งรายการบนตารางรูท (อีกครั้งสมมติว่าเอนทิตีถูกดึงมาด้วย id)
  • ด้วยดัชนีคลัสเตอร์เราสามารถสันนิษฐานได้ว่าค่าสำหรับแถวรูทอยู่ในดัชนี
  • การค้นหาช่วง 20+ (หวังว่าจะเป็นดัชนี) สำหรับค่า pk ของกิจการ
  • สิ่งเหล่านี้อาจไม่ใช่ดัชนีแบบคลัสเตอร์ดังนั้นการค้นหาข้อมูลมากกว่า 20+ ครั้งเมื่อเราทราบว่าแถวลูกที่เหมาะสมคืออะไร

ดังนั้นทั้งหมดสำหรับ mysql แม้จะสมมติว่าดัชนีทั้งหมดอยู่ในหน่วยความจำ (ซึ่งยากกว่าเนื่องจากมีมากกว่า 20 เท่าของพวกมัน) จึงเป็นการค้นหาระยะประมาณ 20 ครั้ง

การค้นหาช่วงเหล่านี้น่าจะประกอบด้วย IO แบบสุ่ม - ตารางที่แตกต่างกันจะอยู่ในจุดที่แตกต่างกันบนดิสก์และเป็นไปได้ว่าแถวที่แตกต่างในช่วงเดียวกันในตารางเดียวกันสำหรับเอนทิตีอาจไม่ต่อเนื่องกัน อัปเดต ฯลฯ )

ดังนั้นสำหรับตัวอย่างนี้การนับครั้งสุดท้ายคือประมาณ20 เท่าของ IO กับ MySQL ต่อการเข้าถึงแบบลอจิคัลเมื่อเทียบกับ MongoDB

นี่คือวิธีที่ MongoDB สามารถเพิ่มประสิทธิภาพการทำงานในกรณีการใช้งานบางอย่าง


43
ถ้าเราเพิ่งวางตารางหลักหนึ่งตารางใน mysql
ariso

99
@ariso: นี่คือการเพิ่มประสิทธิภาพโดย denormalisation มันสามารถเพิ่มประสิทธิภาพได้ อย่างไรก็ตามถ้าคุณทำเช่นนี้คุณจะทิ้งการออกแบบที่สะอาดหมดจดและพลังทั้งหมด (ไม่พูดถึงคุณสมบัติส่วนใหญ่) ของฐานข้อมูลเชิงสัมพันธ์ และใช้งานได้จริงเท่านั้นจนกว่าคุณจะถึงขีด จำกัด คอลัมน์
Sean Reilly

7
@SeanReilly ตัวอย่างของคุณกับเอนทิตี (ควรแก้ไขด้วยออบเจ็กต์, ไม่มีการเขียนโปรแกรมเชิงเอนทิตี้ของ :)) ไม่ถูกต้อง เช่น ariso กล่าวว่าคุณสามารถทำให้เป็นอันดับวัตถุและเก็บไว้ใน db และ deserialize เมื่อจำเป็น (ทุกรูปแบบของอนุกรม) พลังที่แท้จริงของวัตถุที่ยังคงอยู่จะถูกเก็บไว้ใน oodbms ไม่ใช่เอกสาร documnet db แต่ฉันยอมรับว่าแต่ละคนมีจุดประสงค์และความแข็งแกร่งของตัวเอง (แต่ตัวอย่างของคุณทำให้วิสัยทัศน์และความเกี่ยวข้องของหัวข้อนี้สับสนมากขึ้น)
Geo C.

9
20 ฉันจะบอกว่ามีแนวโน้มที่จะไม่แบบสอบถามที่ดีที่สุดในสคีมาฐานข้อมูลที่ดีที่สุดที่อาจเป็นไปได้
Audrius Meskauskas

8
@SeanReilly ฉันพบว่าตัวอย่างของคุณมีประโยชน์มาก คุณสามารถสร้างอินเทอร์เฟซพิเศษให้กับ MySQL ซึ่งจะทำการซีเรียลไลซ์เซชั่นและ deserializes อ๊อพเจ็กไปที่ตารางโดยอัตโนมัติ แต่ทำไมไม่ใช้เฉพาะสิ่งที่ออกแบบมาเพื่อใช้ในแบบนั้น? ด้วยการใช้ "เอนทิตี" ของคุณก็สมเหตุสมผลแล้ว ประเด็นคือคุณกำลังจัดระเบียบข้อมูลเป็นเอกสารแทนที่จะเป็นเขตข้อมูลในตาราง เอกสารนั้นเป็นวัตถุที่ประกอบขึ้นด้วยภาษา OO หรือไม่นั้นไม่เกี่ยวข้องกับตัวอย่าง
BHS

57

คุณมีการทำงานพร้อมกันคือผู้ใช้พร้อมกันหรือไม่? หากคุณเรียกใช้แบบสอบถาม 1,000 ครั้งตรงโดยมีเพียงหนึ่งเธรดจะแทบไม่แตกต่างกัน ง่ายเกินไปสำหรับเครื่องมือเหล่านี้ :)

แต่ฉันขอแนะนำให้คุณสร้างเซสชั่นการทดสอบการโหลดจริงซึ่งหมายถึงการใช้หัวฉีดเช่น JMeter ที่มีผู้ใช้ 10, 20 หรือ 50 คนในเวลาเดียวกันเพื่อให้คุณเห็นความแตกต่าง (ลองฝังโค้ดนี้ภายในเว็บเพจ JMeter สามารถสอบถาม)

ฉันเพิ่งทำมันในวันนี้บนเซิร์ฟเวอร์เดียว (และชุด / ตารางที่เรียบง่าย) และผลลัพธ์ค่อนข้างน่าสนใจและน่าประหลาดใจ (MongoDb เร็วขึ้นมากในการเขียนและอ่านเมื่อเทียบกับเครื่องยนต์ MyISAM และเครื่องยนต์ InnoDb)

นี่ควรเป็นส่วนหนึ่งของการทดสอบของคุณ: เครื่องมือพร้อมกันและ MySQL จากนั้นการออกแบบข้อมูล / สคีมาและความต้องการของแอปพลิเคชันนั้นเป็นข้อกำหนดที่ยิ่งใหญ่เกินกว่าเวลาตอบสนอง แจ้งให้เราทราบเมื่อคุณได้รับผลลัพธ์ฉันยังต้องการข้อมูลเกี่ยวกับสิ่งนี้!


42
คุณสามารถแบ่งปันผลลัพธ์ให้คุณได้หรือไม่?
Imran Omar Bukhsh

1
Ya ผลลัพท์ที่ได้จะมีประโยชน์มาก
Vasil Popov

3
แน่นอนว่านี่เป็นเพียงการขยาย ... ถ้าเป็นแอปเปิ้ลกับแอปเปิ้ลเหมือนที่พวกเขาพูดในหัวข้อที่เหลือ ดังนั้นถ้าเป็น avg มันจะทำการ x ตอนนี้จำลองจากหลาย ๆ แหล่งโปรดอธิบายว่าทำไม mongo ถึงเร็วกว่า กล่าวคือให้พูดเพื่อประโยชน์ของข้อตกลงว่า mysql เร็วขึ้นสำหรับคำร้องขอเดียว ... ทำไมตอนนี้ mongo ถึงเร็วขึ้นสำหรับหลาย ๆ ฉันไม่คิดว่ามันจะเป็นวิทยาศาสตร์ ฉันกำลังบอกว่าการทดสอบนั้นถูกต้อง .. แต่ก็ไม่แน่ใจว่าจะแตกต่างกันอย่างไรถ้าคุณเปรียบเทียบแอปเปิ้ลกับแอปเปิ้ลเหมือนกับที่อธิบายในหัวข้ออื่น ๆ
Seabizkit

35

ที่มา: https://github.com/webcaetano/mongo-mysql

10 แถว

mysql insert: 1702ms
mysql select: 11ms

mongo insert: 47ms
mongo select: 12ms

100 แถว

mysql insert: 8171ms
mysql select: 10ms

mongo insert: 167ms
mongo select: 60ms

1,000 แถว

mysql insert: 94813ms (1.58 minutes)
mysql select: 13ms

mongo insert: 1013ms
mongo select: 677ms

10.000 แถว

mysql insert: 924695ms (15.41 minutes)
mysql select: 144ms

mongo insert: 9956ms (9.95 seconds)
mongo select: 4539ms (4.539 seconds)

91
15 นาทีเพื่อแทรก 10,000 แถว? นั่นเป็นฐานข้อมูล MySQL ที่เกี่ยวกับโลหิตจางมาก จากประสบการณ์ของฉันหากการดำเนินการดังกล่าวเข้าใกล้ระยะเวลา 1 วินาทีโทรศัพท์ของฉันจะสว่างขึ้นพร้อมรับข้อร้องเรียน :)
Mordechai

1
Xtreme Biker ดูที่ลิงค์ ฉันโพสต์การทดสอบจากบุคคลอื่นด้วยการตั้งค่าอื่น ๆ
user2081518

14
บางจุด: 1) Mysql จำเป็นต้องปรับให้เหมาะสมและกำหนดค่าอย่างเหมาะสมมีหลายวิธีในการแทรกข้อมูลจำนวนมากและทำอย่างถูกต้องอาจใช้เวลา 0.1% ของ 15 นาทีดูหน้านี้ 2) MongoDB ไม่ได้เขียนข้อมูลลงดิสก์ทันทีซึ่งเป็นสาเหตุให้ "ดู" เร็วขึ้น แต่ถ้าคอมพิวเตอร์ของคุณขัดข้องข้อมูลจะสูญหาย 3) การอ่านเร็วขึ้นมากใน MySQL
elipoultorak

81
15 นาทีสำหรับ 10.000 แถว คุณพิมพ์แต่ละแถวหรือไม่ =))))
Iurie Manea

7
ใครก็ตามที่เชื่อว่ามีการอ้างว่าใช้เวลา 1.7 วินาทีในการแทรกสิบแถวลงใน mysql สมควรได้รับความเจ็บปวดที่พวกเขาได้รับจาก mongo
John Haugeland

20

man ,,, คำตอบก็คือโดยทั่วไปคุณกำลังทดสอบ PHP และไม่ใช่ฐานข้อมูล

ไม่ต้องวนซ้ำผลลัพธ์ไม่ว่าจะใส่ความคิดเห็นในการพิมพ์หรือไม่ มีเวลาอันสั้น

   foreach ($cursor as $obj)
    {
        //echo $obj["thread_title"] . "<br><Br>";
    }

ในขณะที่อีกก้อนใช้ yacking ตัวเลข rand

function get_15_random_numbers()
{
    $numbers = array();
    for($i=1;$i<=15;$i++)
    {
        $numbers[] = mt_rand(1, 20000000) ;

    }
    return $numbers;
}

จากนั้นจึงมีความแตกต่างที่สำคัญ b / w implode และใน

และในที่สุดสิ่งที่เกิดขึ้นที่นี่ ดูเหมือนว่าจะสร้างการเชื่อมต่อในแต่ละครั้งดังนั้นจึงเป็นการทดสอบเวลาในการเชื่อมต่อบวกกับเวลาของแบบสอบถาม

$m = new Mongo();

VS

$db = new AQLDatabase();

ดังนั้น 101% ที่เร็วขึ้นของคุณอาจกลายเป็นเร็วขึ้น 1,000% สำหรับข้อความค้นหาต้นแบบที่ถูกแยกออกจากดนตรีแจ๊ส

urghhh


4
โดยปกติการฝึกการเขียนโค้ดสามารถสร้างความแตกต่างได้อย่างมากในทุกสถานการณ์ แต่นี่ไม่ได้เฉพาะเจาะจงกับภาษาประเภทใด API หรือส่วนขยายใด ๆ การสร้างตัวเลขสุ่มก่อนเริ่มจับเวลาจะสร้างความแตกต่าง แต่เวลาส่วนใหญ่ในกระบวนการไม่ต้องสงสัยจากธุรกรรมฐานข้อมูล การสร้างเลขสุ่มนั้นไม่สำคัญฐานข้อมูล SQL และ NoSQL ไม่ใช่
JSON

1
อย่าเลือกหมายเลขแรนด์ ชัดเจนว่าคุณพลาดการเชื่อมต่อที่สร้างขึ้นในแต่ละครั้ง ปัญหาทั้งหมดรวมถึงการทดสอบอย่างอื่นนอกเหนือจากที่ตั้งใจไว้
Gabe Rainbow

2
ไม่ไม่พลาด MySQL จะไม่ปิดการเชื่อมต่อจนกว่าสคริปต์จะเสร็จสิ้นเว้นแต่จะเรียก mysqli_close () มิฉะนั้นการเรียกซ้ำไปยัง mysqli_connect () จะดึงทรัพยากร mysql ที่มีอยู่จากตารางทรัพยากรปัจจุบันแทนที่จะทำตามขั้นตอนการเชื่อมต่อใหม่ ฉันไม่แน่ใจว่าวัตถุ AQLDatabase คืออะไร แต่ถ้าใช้ mysql lib (ซึ่งน่าจะเป็น) มันจะมีพฤติกรรมเหมือนกัน ส่วนขยาย MongoDB ใช้การรวมการเชื่อมต่อดังนั้นสิ่งพื้นฐานเดียวกันนี้เกิดขึ้นเมื่อสร้างการเชื่อมต่อของ MongoDB มากกว่าหนึ่งครั้งในสคริปต์
JSON

ฉันยอมรับว่าเกณฑ์มาตรฐานของเขาสามารถทำได้แตกต่างกัน แต่มันสะท้อนให้เห็นถึงผลลัพธ์พื้นฐานเช่นเดียวกับม้านั่ง MySQL กับ Mongo อื่น ๆ ที่ฉันเคยเห็น โดยทั่วไป Mongo จะเร็วกว่าเมื่อทำการแทรก (เร็วกว่าสำหรับการแทรกแบบง่าย ๆ ) และ MySQL จะเร็วกว่าเมื่อเลือก
JSON

ยอมรับว่าฉันโกรธเกินไป มันคือ concat string html ของ "<br>" ที่ 'กระตุ้น' ให้ฉันออกไป คุณไม่จำเป็นต้องพิมพ์สวย ๆ ในการทดสอบ แม้ซ้ำมันดูเหมือนว่าการทดสอบ php และไม่ทดสอบฐานข้อมูล โดยรวมแล้ว AQLDatabase 'อาจเป็นไปได้ / อาจเป็นช่วงเวลาที่ ... ส่วนผสมที่มากขึ้นหมายถึงไม่ทราบมากขึ้น
Gabe Rainbow

17

https://github.com/reoxey/benchmark

มาตรฐาน

การเปรียบเทียบความเร็วของ MySQL และ MongoDB ใน GOLANG1.6 และ PHP5

ระบบที่ใช้สำหรับการวัดประสิทธิภาพมาตรฐาน: DELL cpu i5 4th gen 1.70Ghz * 4 ram 4GB GPU ram 2GB

การเปรียบเทียบความเร็วของ RDBMS เทียบกับ NoSQL สำหรับ INSERT, SELECT, UPDATE, DELETE ดำเนินการจำนวนแถวที่แตกต่างกัน 10,100,1000,10000,100000,1000000

ภาษาที่ใช้ในการดำเนินการคือ PHP5 และภาษาที่เร็วที่สุดของ Google GO 1.6

________________________________________________
GOLANG with MySQL (engine = MyISAM)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            INSERT
------------------------------------------------
num of rows             time taken
------------------------------------------------
10                      1.195444ms
100                     6.075053ms
1000                    47.439699ms
10000                   483.999809ms
100000                  4.707089053s
1000000                 49.067407174s


            SELECT
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 872.709µs


        SELECT & DISPLAY
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 20.717354746s


            UPDATE
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 2.309209968s
100000                  257.411502ms
10000                   26.73954ms
1000                    3.483926ms
100                     915.17µs
10                      650.166µs


            DELETE
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 6.065949ms
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


________________________________________________
GOLANG with MongoDB
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            INSERT
------------------------------------------------
num of rows             time taken
------------------------------------------------
10                      2.067094ms
100                     8.841597ms
1000                    106.491732ms
10000                   998.225023ms
100000                  8.98172825s
1000000                 1m 29.63203158s


            SELECT
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 5.251337439s


        FIND & DISPLAY (with index declared)
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 21.540603252s


            UPDATE
------------------------------------------------
num of rows             time taken
------------------------------------------------
1                       1.330954ms
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

________________________________________________
PHP5 with MySQL (engine = MyISAM)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            INSERT
------------------------------------------------
num of rows             time taken
------------------------------------------------
 10                     0.0040680000000001s
 100                    0.011595s
 1000                   0.049718s
 10000                  0.457164s
 100000                 4s
 1000000                42s


            SELECT
------------------------------------------------
num of rows             time taken
------------------------------------------------
 1000000                <1s


            SELECT & DISPLAY
------------------------------------------------
num of rows             time taken
------------------------------------------------
  1000000               20s
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

________________________________________________
PHP5 with MongoDB 
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
            INSERT
------------------------------------------------
num of rows             time taken
------------------------------------------------
10                      0.065744s
100                     0.190966s
1000                    0.2163s
10000                   1s
100000                  8s
1000000                 78s


            FIND
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 <1s


            FIND & DISPLAY
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 7s


            UPDATE
------------------------------------------------
num of rows             time taken
------------------------------------------------
1000000                 9s

myisam ไม่ใช่ innodb รุ่น mongodb และเอ็นจิ้นการจัดเก็บรุ่นใด

1
เป็นสิ่งสำคัญที่จะต้องระบุเวอร์ชันของ MySQL และ MongoDB
Miron

1
อย่าใช้ MyISAM ใช้เม็ดมีดแบบแบตช์!
Rick James

MySQL เร็วกว่า Mongodb ในแบบสอบถามแบบแทรก?! มันดูเหมือนจะไม่เป็นความจริงจนกว่า mysql จะต้องเตรียมคอลัมน์และ การเลือก mysql เร็วกว่าการเลือก mongodb แต่ในการสืบค้นแบบแทรก mongo จะเร็วขึ้น
Exind

6

นี่คืองานวิจัยเล็กน้อยที่สำรวจ RDBMS กับ NoSQL โดยใช้ MySQL กับ Mongo ข้อสรุปนั้นสอดคล้องกับการตอบสนองของ @Sean Reilly ในระยะสั้นประโยชน์มาจากการออกแบบไม่ใช่ความแตกต่างความเร็วดิบ สรุปในหน้า 35-36:

RDBMS เทียบกับ NoSQL: การเปรียบเทียบประสิทธิภาพและการปรับสเกล

โครงการทดสอบวิเคราะห์และเปรียบเทียบประสิทธิภาพและความสามารถในการขยายของฐานข้อมูลทั้งสองประเภท การทดลองที่ทำนั้นรวมถึงการเรียกใช้จำนวนและชนิดของแบบสอบถามที่แตกต่างกันบางอย่างมีความซับซ้อนกว่าอย่างอื่นเพื่อที่จะวิเคราะห์ว่าฐานข้อมูลมีขนาดเพิ่มขึ้นอย่างไร ปัจจัยที่สำคัญที่สุดในกรณีนี้คือประเภทการสืบค้นที่ใช้เป็น MongoDB สามารถจัดการกับการสืบค้นที่ซับซ้อนได้เร็วขึ้นเนื่องจากสคีมาที่ง่ายกว่าเมื่อเสียสละการทำซ้ำข้อมูลซึ่งหมายความว่าฐานข้อมูล NoSQL อาจมีการทำซ้ำข้อมูลจำนวนมาก แม้ว่า schema ที่ถูกโยกย้ายโดยตรงจาก RDBMS สามารถใช้สิ่งนี้จะกำจัดข้อได้เปรียบของ MongoDB ที่แสดงข้อมูลพื้นฐานของเอกสารย่อยที่อนุญาตให้ใช้แบบสอบถามน้อยไปยังฐานข้อมูลเป็นตารางที่รวมกันแม้ประสิทธิภาพเพิ่มขึ้นซึ่ง MongoDB มีมากกว่า MySQL ในการสืบค้นที่ซับซ้อนเหล่านี้เมื่อมาตรฐานสร้างแบบจำลองการสืบค้น MySQL คล้ายกับการค้นหาที่ซับซ้อนของ MongoDB โดยการใช้ SELECTs ซ้อนกัน MySQL ทำงานได้ดีที่สุดแม้ว่าจะมีจำนวนการเชื่อมต่อที่สูงกว่า เกณฑ์การสืบค้นประเภทสุดท้ายซึ่งเป็นแบบสอบถามที่ซับซ้อนที่มีสอง JOINS และแบบสอบถามย่อยแสดงให้เห็นว่า MongoDB มีข้อดีเหนือกว่า MySQL เนื่องจากมีการใช้เอกสารย่อย ข้อดีนี้มาจากต้นทุนการทำสำเนาข้อมูลซึ่งทำให้ขนาดฐานข้อมูลเพิ่มขึ้น หากคำสั่งดังกล่าวเป็นเรื่องปกติในแอปพลิเคชันคุณควรพิจารณาว่าฐานข้อมูล NoSQL เป็นทางเลือกในขณะที่คำนึงถึงต้นทุนในการจัดเก็บและขนาดหน่วยความจำที่เกิดจากขนาดฐานข้อมูลที่ใหญ่ขึ้น


-6

บนเซิร์ฟเวอร์เดี่ยว MongoDb จะไม่เร็วกว่า mysql MyISAM ทั้งในการอ่านและเขียนขนาดของตาราง / เอกสารที่กำหนดมีขนาดเล็ก 1 GB ถึง 20 GB
MonoDB จะเร็วขึ้นในการลดแบบขนานบนมัลติโหนดซึ่ง Mysql ไม่สามารถปรับขนาดในแนวนอน


5
คุณสามารถให้หลักฐานบางอย่างหรือรายละเอียดเพิ่มเติมเพื่อสำรองข้อมูลได้หรือไม่?
Steve Westbrook

ไม่สามารถปรับขนาดในแนวนอนได้ แล้ว NDB ล่ะ DRBD รองรับ MySQL หรือไม่
Ernestas

นี่ไม่เป็นความจริง. MongoDB มีการ จำกัด เอกสาร 16MD Mysql สามารถมีได้มากขึ้นถ้าคุณต้องการ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.