Ответ 1
Во-первых, сравните яблоки с яблоками: Чтение и запись с помощью MongoDB похожи на однократные чтения и записи по первичному ключу в таблице без некластеризованных индексов в РСУБД.
Итак, давайте сравним это: http://mysqlha.blogspot.de/2010/09/mysql-versus-mongodb-yet-another-silly.html
И получается, что разница в скорости в справедливом сравнении точно такой же примитивной операции невелика. На самом деле MySQL немного быстрее. Я бы сказал, что они эквивалентны.
Почему? Потому что на самом деле обе системы делают подобные вещи в этом конкретном тесте. Возвращение одной строки, поиск по первичному ключу, на самом деле не так много работает. Это очень быстрая операция. Я подозреваю, что накладные расходы на межпроцессные коммуникации являются значительной его частью.
Я предполагаю, что более настраиваемый код в MySQL перевешивает несколько менее систематические накладные расходы MongoDB (без логических блокировок и, возможно, некоторых других мелких вещей).
Это приводит к интересному выводу: Вы можете использовать MySQL как базу данных документов и получать отличную производительность.
Если интервьюер сказал: "Нам не нужны документы или стили, нам просто нужна гораздо более быстрая база данных, как вы думаете, мы должны использовать MySQL или MongoDB?", что бы я ответил?
Я бы рекомендовал ненадолго игнорировать производительность и посмотреть на относительную силу двух систем. Такие вещи, как масштабирование (путь вверх) и репликация, напоминают MongoDB. Для MySQL существует намного больше функций, таких как богатые запросы, модели concurrency, улучшенная оснастка и зрелость и многое другое.
В принципе, вы можете торговать функциями для производительности. Готовы ли вы это сделать? Это выбор, который нельзя сделать вообще. Если вы выберете производительность любой ценой, подумайте над настройкой MySQL прежде, чем добавить другую технологию.
Вот что происходит, когда клиент извлекает одну строку/документ с помощью первичного ключа. Я буду комментировать различия между обеими системами:
- Клиент создает двоичную команду (тот же)
- Клиент отправляет его через TCP (тот же)
- Сервер анализирует команду (тот же)
- Сервер обращается к плану запроса из кеша (только SQL, а не MongoDB, а не HandlerSocket)
- Сервер запрашивает компонент B-Tree для доступа к строке (такой же)
- Сервер принимает физическую блокировку readonly на пути B-Tree, ведущем к строке (той же)
- Сервер принимает логическую блокировку в строке (только SQL, а не MongoDB, а не HandlerSocket)
- Сервер сериализует строку и отправляет ее через TCP (тот же)
- Клиент десериализует его (тот же)
Есть только два дополнительных шага для типичных SQL-баз RDBMS. Вот почему на самом деле нет разницы.