пятница, 31 января 2014 г.

Что такое Mongo DB?


Mongo DB — высокопроизводительная документо-ориентированная база данных. Особенности этой СУБД:
  • Документное хранилище, не требующее создания схем (таблиц)
  • Запросы в стиле JSON (очень удобно)
  • Широкий набор (атомарных) операций над данными (условный поиск, сложная вставка/обновление и т.п.)
  • Разные типы данных (поддержка массивов)
  • Поддержка индексов (B-Tree)
  • Автовосстановление, шардинг и репликация в коробке
  • Профилирование, хранение больших объектов, административный интерфейс, серверные функции, Map/Reduce и многое другое
Mongo DB и MySQL

Многое из вышеперечисленного есть и в решениях более знакомых, таких, как MySQL. Давайте сравнивать:
Итак преимущества Mongo:
 MongoDBMySQL
Модель данныхДокументнаяРеляционная
Типыstring, int, double, boolean, date, bytearray, object, arrayТипы MysQL
Большие объектыДаДа
РепликацияMaster-slaveMaster-slave
Хранилище наборов данныхКоллекцииТаблицы
Метод запросовобъектный язык запросовSQL
Дополнительные индексыДаДа
АтомарностьДокументРасширенная
Манипулирование наборами данных на сервереMap/Reduce, серверный javascriptSQL
ПлатформаC++C
Контроль конкурентности (Concurrency Control)Update in PlaceMVCC
Объектный язык запросов (который намного легче SQL, что является важным преимуществом для большинства задач, не требующих сложных выборок)
Поддержка Map/Reduce для распределенных операций над данным
Документы, не требующие определения схемы. Одно из самых важных преимуществ. Преимущество заключается в том, что у Вас нет нужды хранить пустые ячейки данных в каждом документе.
Поддержка сложных массивов. Каждый элемент массива может представлять из себя объект
Поддержка шардинга на уровне платформы

Производительность

Для тестирования возьмем таблицу в MySQL (messages) с простой структурой (таблица личных сообщений пользователей одного из моих проектов). Количество записей в ней — около 200 тыс. Все данные скопированы в mongo с соотв. индексами.

Для тестирования будем использовать следующий скрипт:
<?php
$m = new Mongo();
$col = $m->messages->threads;

$s = microtime(true);
for ( $i = 0; $i < 5000; $i++ )
        $cursor = $col->find( array('user_id' => $i) );

$t = microtime(true) - $s;

echo "Mongo: " .  $t . "\n\n";


mysql_connect('localhost');
mysql_select_db('messages');

$s = microtime(true);
for ( $i = 0; $i < 5000; $i++ )
        mysql_query('SELECT id FROM messages WHERE mailed_by = ' . $i);
$t = microtime(true) - $s;

echo 'MySQL: ' . $t . "\n\n";
Как видно из скрипта, мы сделали по 5000 выборок из обеих СУБД. Поля, по которым проходила выборка являются индексными. Ниже приведены результаты второго запуска скрипта (в первый раз значения были гораздо большими, т.к. таблицы не были подтянуты в память):
Mongo: 0.010502815246582
MySQL: 0.27930092811584
Как видим MySQL справился с однотипной задачей на порядок медленее. Для тестирования были использованы стандартные конфигурации обоих платформ, поэтому настройка может внести изменения в эти результаты.

Когда выбирать Mongo DB, а когда MySQL?

Mongo представляет из себя очень функциональное решение, тем не менее обладает рядом ограничений. Например, возможность сделать JOIN (а нужен ли он?). Также язык запросов Mongo конечно устапает SQL в гибкосте и возможностях. Но нужна ли Вам эта гибкость в Ваших задачах? Одним словом, Mongo подходит почти под любой класс задач, не требующих сложных выборок.

Что же касается MySQL (или родственных продуктов), то он остается решением для задач требующих нетривиальных выборок (например, статистические или аналитически запросы).

Личное впечатление

После первого знакомства с Mongo DB, этот продукт оставил очень хорошее впечатление и заставил вернуться к нему еще раз. Помимо прочих преимуществ:

  • Очень легкий и интуитивно понятный
  • Простая установка, все заработало с первого раза
  • Отличная документация, хорошее сообщество
  • Множество клиентских разработок, в т.ч. под PHP
  • При детальном рассмотрении, выяснилось, что сам продукт обладает очень обширным функционалом (например, полнотекстовый поиск). Кажущийся простым на поверхности, MongoDB представляет из себя очень мощную платформу для работы с данными.

Совсем недавно мы переписали несколько фукнциональных частей проекта на Mongo. В процессе работы проблем почти не возникало, за исключением некоторых:

  • Mongo строго типизирован и не приводит типы автоматически (такой возможности впринципе нет, учитывая отсуствие каких-либо метаданных о коллекциях и документах). Поэтому в динамически типизированном PHP приходится приводить данные к нужным типам (например, когда они приходят из формы).
  • Не хватило возможностей для работы с массивами, что немного сбило с толку. С одной стороны - вложенные массивы - очень удобная вещь, с другой стороны - нет таких штук, как их фильтрация или сортировка. Надеюсь все это будет вскоре, хотя сейчас есть возможность реализовать это с помощью серверных функций.

Комментариев нет:

Отправить комментарий