2015-04-29 4 views
4

В настоящее время я работаю над PHP-приложением (предварительный выпуск).Какая база данных для работы с очень большими наборами результатов?

фон

Мы имеем таблицу в нашей базе данных MySQL, которая, как ожидается, расти чрезвычайно велик - это не было бы необычно для одного пользователя, чтобы иметь 250,000 строк в этой таблице. Каждой строке таблицы присваивается количество и дата, между прочим.

Кроме того, эта таблица читается с (и написана) очень часто - на большинстве страниц. Учитывая, что каждая строка имеет дату, я использую GROUP BY date, чтобы свести к минимуму размер набора результатов, заданного MySQL. Строки, содержащиеся в том же году, теперь можно рассматривать как всего одно.

Однако типичная страница по-прежнему будет иметь результат в диапазоне от 1000 до 3000 результатов. Есть также места, где исполняется множество SUM(), всего несколько десятков - если не сотни - тысяч строк.

Попытка MySQL

На обычной странице, MySQL обычно принимает вокруг вокруг 600-900ms. Использование LIMIT и смещения не помогли производительности, и данные были сильно нормализованы, и поэтому не похоже, что дальнейшая нормализация поможет.

Хуже того, есть части приложения, которые требуют извлечения из базы данных 10 000-15 000 строк. Результаты затем используются при вычислении PHP и соответственно форматируются. Учитывая это, производительность MySQL не была приемлемой.

Попытка MongoDB

Я преобразовал таблицу MongoDB, и это скорость быстрее - обычно это занимает около 250 мс для получения 2000 документов. Однако команда $group в конвейере агрегации, необходимая для объединения полей в зависимости от года, в который они входят, замедляет работу. К сожалению, сохранение и обновление, когда всякий раз, когда документ удаляется/обновляется/вставлен, также не может быть и речи, потому что, хотя мы можем использовать годовой итог для некоторых частей приложения, в других частях вычисления требуют, чтобы каждая сумма падала на конкретная дата.

Я также рассмотрел Redis, хотя, по-моему, сложность данных не соответствует тому, ради чего был разработан Redis.

Заключительный Стро

В довершение всего этого, важным фактором является скорость. Таким образом, производительность - это приоритеты.

Вопросы:

  1. Что является лучшим способом для хранения данных, которые часто чтения/записи и быстро растет, с осознанием того, что большинство запросов будут получать очень большой результат-набор?
  2. Есть ли еще одно решение проблемы? Я полностью открыт для предложений.

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

+0

Считаете ли вы попыткой попробовать Elastica (https://elastic.co)? Когда дело доходит до агрегации/статистики, это действительно здорово. Обычно это хорошая идея объединить MongoDB для написания и поддержания индекса Elastica в фоновом режиме. – iamtankist

+0

Нет базы данных, а не одного программного проекта, который может сделать что-то другое, чем это делает MySQL, когда вы смотрите на ядро. В действительности, каждый раз, когда MySQL медленный, это потому, что он не настроен. Если вам нужна производительность, вам нужны аппаратные ресурсы - достаточное количество оперативной памяти, хороший процессор и быстрый SSD. Если у вас этого нет, практически нет ничего, что можно было бы сделать с точки зрения программного обеспечения, чтобы что-то быстро работало на устаревшем компьютере. Короче говоря - какая у вас конфигурация MySQL? Вы хотите, чтобы все поместилось в память, чтобы все ваше агрегирование было быстрым. –

+0

@iamtankist Я не считал Эластику. Кажется, есть некоторые проблемы, с которыми люди сталкиваются [этот вопрос] (http://elasticsearch-users.115913.n3.nabble.com/ES-is-slow-when-I-try-to-return-a- огромные-множество результатов td4027757.html). Интересно, все ли так? Вы использовали его сами? Нотабене Мой сервер MySQL сидит на бродячем поле на моей локальной машине, что очень хорошо подходит для других ситуаций. Мне не кажется, что аппаратное обеспечение обязательно является узким местом здесь, однако я могу ошибаться. – Adviov

ответ

2

Я только прочитал первые две строки, но вы используете агрегацию (GROUP BY), а затем ожидаете, что она просто сделает в реальном времени?

Я скажу, что вы новичок во внутренних базах данных, чтобы не подрывать вас, а пытаться помочь вам.

Оператор группы в MySQL и MongoDB находится в памяти. Другими словами, он принимает любую структуру данных, которую вы povide, будь то индекс или документ (строка), и он будет проходить через каждую строку/документ, беря поле и группируя его.

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

Фактически, используя LIMIT с OFFSET, возможно, это просто замедляет ход событий еще более откровенно. Поскольку после написания набора MySQL затем нужно запросить еще раз, чтобы получить ответ.

После выполнения этого будет выписан результат, MySQL запишет его в результирующий набор (память и IO используются здесь), и MongoDB ответит встроенным, если вы не установили $out, максимальный размер встроенного вывода 16 МБ (максимальный размер документа).

Конечная точка, чтобы забрать здесь: агрегации ужасна

Там нет серебряной пули, которая избавит вас здесь, некоторые базы данных будут пытаться хвастается их скорость и т.д. и т.д., но факт является самым большими агрегаторами используйте что-то, называемое «предварительно агрегированные отчеты». Вы можете найти краткое введение в документацию MongoDB: http://docs.mongodb.org/ecosystem/use-cases/pre-aggregated-reports/

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

+0

Интересно. Предварительно агрегированные отчеты - хорошее решение, чтобы избежать группы в конвейере агрегации, однако это действительно только половина моей проблемы. Учитывая, что я имею дело с 60-летними периодами с ежедневной «детализацией», это все еще более 20 000 дней в течение 60 лет - и учитывая, что эта гранулярность не может увеличиться за ее пределами, я возвращаюсь к своему первоначальному вопросу, потому что это казалось бы, мне еще нужно собрать 20 000 строк. Поправьте меня, если я неверно истолковал ваш ответ. Цените помощь! :) – Adviov

+0

@ Luke, если у вас на самом деле нет пути, вам просто придется кусать пулю, как Google Analytics и другие программы Google Analytics. Они существуют в реальном времени в очень маленьких группах, обычно минут за минутой, но как только вы запрашиваете отчет, вам нужно ждать загрузки материала. Какие страницы вы делаете в реальном времени? – Sammaye

+0

Большинство страниц могут быть агрегированы - будь то по предлагаемым предварительно агрегированным отчетам или чему-то еще. Страницы, которые требуют ежедневного контроля, являются отчетами подобного рода и будут рассматриваться реже - но отнюдь нечасто. Я беспокоюсь о масштабируемости, когда люди ждут. Если каждый отчет занимает 2-5 секунд для загрузки, я не уверен относительно того, где это оставляет меня даже с умеренным количеством одновременных пользователей. – Adviov

Смежные вопросы