MongoDB не магически быстрее. Если вы храните одни и те же данные, организованные в основном одинаковым образом, и получаете к ним одинаковый доступ, тогда вы не должны ожидать, что ваши результаты будут сильно отличаться. В конце концов, MySQL и MongoDB являются GPL, поэтому, если в Mongo был какой-то магически лучший код ввода-вывода, команда MySQL могла бы просто включить его в свою кодовую базу.
Люди видят реальную производительность MongoDB в значительной степени потому, что MongoDB позволяет вам делать запросы другим способом, более чувствительным к вашей рабочей нагрузке.
Например, рассмотрим дизайн, который сохранил много информации о сложном объекте в нормализованном порядке. Это может легко использовать десятки таблиц в MySQL (или любой реляционной базе данных) для хранения данных в нормальной форме со многими индексами, необходимыми для обеспечения реляционной целостности между таблицами.
Теперь рассмотрим тот же дизайн с хранилищем документов. Если все эти связанные таблицы подчинены основной таблице (а они часто бывают), вы можете смоделировать данные таким образом, чтобы вся сущность сохранялась в одном документе. В MongoDB вы можете хранить это как один документ, в одной коллекции. Именно здесь MongoDB начинает обеспечивать превосходную производительность.
В MongoDB, чтобы получить всю сущность, вы должны выполнить:
- Один просмотр индекса для коллекции (при условии, что объект извлекается по id)
- Получить содержимое одной страницы базы данных (фактический двоичный документ json)
Итак, поиск по b-дереву и чтение двоичной страницы. Log (n) + 1 IO. Если индексы могут полностью находиться в памяти, то 1 IO.
В MySQL с 20 таблицами вы должны выполнить:
- Один просмотр индекса в корневой таблице (опять же, при условии, что сущность выбирается по id)
- С кластеризованным индексом мы можем предположить, что значения для корневой строки находятся в индексе
- 20 + поиск диапазона (возможно, по индексу) для значения pk сущности
- Вероятно, это не кластеризованные индексы, поэтому те же самые 20+ поисков данных, когда мы выясним, какие уместные дочерние строки.
Таким образом, общая сумма для mysql, даже если предположить, что все индексы находятся в памяти (что сложнее, поскольку их в 20 раз больше), составляет около 20 поисков по диапазонам.
Эти поиски диапазона, вероятно, состоят из случайного ввода-вывода - разные таблицы определенно будут находиться в разных местах на диске, и возможно, что разные строки в одном и том же диапазоне в одной и той же таблице для объекта могут быть не смежными (в зависимости от того, как сущность была обновлена и т. д.).
Таким образом, для этого примера итоговый подсчет примерно в 20 раз больше операций ввода-вывода с MySQL на логический доступ по сравнению с MongoDB.
Вот так MongoDB может повысить производительность в некоторых случаях .