Първо, нека сравним ябълките с ябълките:Четенето и записването с MongoDB са като единични четения и записвания чрез първичен ключ в таблица без неклъстерирани индекси в RDBMS.
Така че нека сравним точно това:http://mysqlha.blogspot.de/2010/09/mysql-versus-mongodb-yet-another-silly.html
И се оказва, че разликата в скоростта при справедливо сравнение на точно същата примитивна операция не е голяма. Всъщност MySQL е малко по-бърз. Бих казал, че са еквивалентни.
Защо? Защото всъщност и двете системи правят подобни неща в този конкретен бенчмарк. Връщането на един ред, търсен по първичен ключ, всъщност не е толкова много работа. Това е много бърза операция. Подозирам, че режийните разходи за комуникация между процеси са голяма част от това.
Предполагам, че по-настроеният код в MySQL надвишава малко по-малко систематичните режийни разходи на MongoDB (без логически ключалки и вероятно някои други малки неща).
Това води до интересно заключение:Можете да използвате MySQL като база данни с документи и да получите отлична производителност от нея.
Ако интервюиращият каже:„Не ни интересуват документи или стилове, просто имаме нужда от много по-бърза база данни, мислите ли, че трябва да използваме MySQL или MongoDB?“, какво бих отговорил?
Бих препоръчал да пренебрегнете производителността за момент и да погледнете относителната сила на двете системи. Неща като мащабиране (нагоре) и репликация идват на ум за MongoDB. За MySQL има много повече функции като богати заявки, модели на едновременност, по-добри инструменти и зрялост и много други.
По принцип можете да обменяте функции за производителност. Готови ли сте да направите това? Това е избор, който не може да бъде направен по принцип. Ако изберете производителност на всяка цена, помислете първо за настройка на MySQL, преди да добавите друга технология.
Ето какво се случва, когато клиентът извлече един ред/документ по първичен ключ. Ще коментирам разликите между двете системи:
- Клиентът изгражда двоична команда (същата)
- Клиентът го изпраща през TCP (същото)
- Сървърът анализира командата (същата)
- Сървърът осъществява достъп до план за заявка от кеша (само SQL, не MongoDB, не HandlerSocket)
- Сървърът иска от компонента B-Tree достъп до реда (същия)
- Сървърът взема физическо заключване само за четене по пътя на B-дървото, водещ до реда (същото)
- Сървърът приема логическо заключване на реда (само SQL, не MongoDB, не HandlerSocket)
- Сървърът сериализира реда и го изпраща през TCP (същото)
- Клиентът го десериализира (същото)
Има само две допълнителни стъпки за типичните SQL-бази RDBMS. Ето защо всъщност няма разлика.