Статистика в реальном времени: MySQL (/Дождь) или MongoDB?

Мы работаем над проектом, в котором будут отображаться статистические данные о действиях в реальном времени (например, клики). При каждом нажатии мы будем регистрировать информацию, такую ​​как дата, возраст и пол (они поступают из Facebook), местоположение и т.д.

Мы обсуждаем лучшее место для хранения этой информации и использования их для статистики в реальном времени. Мы будем отображать общую статистику: например, количество кликов, количество кликов, сделанных мужчиной/женщиной, количество кликов, разделенных по возрастным группам (например, 18-24, 24-30...).

Так как на сайте мы везде используем MongoDB, мой коллега подумал, что мы должны хранить статистику внутри него. Однако я предпочел бы базу данных на базе SQL для этой задачи, такую ​​как MySQL (или, возможно, "Дождь" ), потому что я считаю, что SQL лучше при выполнении операций, таких как агрегация данных. Несмотря на накладные расходы на разбор SQL, я думаю, что MySQL/Drizzle может быть быстрее, чем базы данных No-SQL. И вставки также не слишком медленны при использовании запросов INSERT DELAYED.

Обратите внимание, что нам не нужно выполнять JOINS или собирать данные из нескольких таблиц/коллекций. Таким образом, нам все равно, отличается ли база данных. Однако мы заботимся о масштабируемости и надежности. Мы строим что-то, что (надеюсь) станет очень большим, и мы разработали каждую строку кода с учетом масштабируемости.

Что вы думаете об этом? Есть ли причина предпочесть MongoDB над MySQL/Drizzle для этого? Или это безразлично? Какой из них вы бы использовали, если бы вы были нами?

Спасибо, Alessandro

Ответы

Ответ 1

Итак, BuddyMedia использует часть этого. Gilt Groupe сделала что-то довольно классное с Hummingbird (node.js + MongoDB).

Работая над крупным онлайн-рекламодателем в пространстве социальных сетей, я могу подтвердить, что в режиме реального времени отчет действительно боль. Попытка "свертывания" 500-миллиметровых показов в день - это уже вызов, но попытка сделать это в режиме реального времени, но это привело к некоторым значительным ограничениям. (например, это было фактически отложено на 5 минут:)

Откровенно говоря, этот тип проблемы является одной из причин, по которым я начал использовать MongoDB. И я не единственный. Люди используют MongoDB для всех видов аналитики в реальном времени: мониторинг сервера, централизованное ведение журнала, а также отчеты о панели мониторинга.

Настоящим ключом при выполнении этого типа отчетности является понимание того, что структура данных полностью отличается от MongoDB, вы избегаете "агрегационных" запросов, поэтому запросы и выходные диаграммы будут разными. Там некоторые дополнительные кодировки работают на стороне клиента.

Вот ключ, который может указать вам в правильном направлении для этого с MongoDB. Взгляните на следующую структуру данных:

{
  date: "20110430",
  gender: "M",
  age: 1, // 1 is probably a bucket
  impression_hour: [ 100, 50, ...], // 24 of these
  impression_minute: [ 2, 5, 19, 8, ... ], // 1440 of these
  clicks_hour: [ 10, 2, ... ],
  ...
}

Здесь, очевидно, есть некоторые настройки, соответствующие индексы, возможно, сбрасывание данных + пол + возраст в _id. Но такая базовая структура аналитики click с MongoDB. Очень легко обновить впечатление и клики { $inc : { clicks_hour.0 : 1 } }. Вы можете обновить весь документ атомарно. И на самом деле довольно естественно отчитываться. У вас уже есть массив, содержащий ваши часовые или минутные точки данных.

Надеюсь, это указывает на то, что вы в правильном направлении.

Ответ 2

MongoDB отлично подходит для такого рода вещей и, безусловно, будет быстрее, чем MySQL, хотя не стоит недооценивать, насколько мощным может быть MySQL - многие компании создали с ним инструменты для аналитики.

Посмотрите на эту презентацию Патрика Стоукса из BuddyMedia о том, как они использовали MongoDB для своей аналитической системы.

http://www.slideshare.net/pstokes2/social-analytics-with-mongodb