В настоящее время я работаю над 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.
Заключительный Стро
В довершение всего этого, важным фактором является скорость. Таким образом, производительность - это приоритеты.
Вопросы:
- Что является лучшим способом для хранения данных, которые часто чтения/записи и быстро растет, с осознанием того, что большинство запросов будут получать очень большой результат-набор?
- Есть ли еще одно решение проблемы? Я полностью открыт для предложений.
Я немного застрял в данный момент, я не смог получить такой большой результат в приемлемом количестве времени.Похоже, что большинство хранилищ данных отлично подходят для небольших размеров извлечения - даже при больших объемах данных, - но я не смог найти что-либо, получая большие объемы данных из еще более крупной таблицы/коллекции.
Считаете ли вы попыткой попробовать Elastica (https://elastic.co)? Когда дело доходит до агрегации/статистики, это действительно здорово. Обычно это хорошая идея объединить MongoDB для написания и поддержания индекса Elastica в фоновом режиме. – iamtankist
Нет базы данных, а не одного программного проекта, который может сделать что-то другое, чем это делает MySQL, когда вы смотрите на ядро. В действительности, каждый раз, когда MySQL медленный, это потому, что он не настроен. Если вам нужна производительность, вам нужны аппаратные ресурсы - достаточное количество оперативной памяти, хороший процессор и быстрый SSD. Если у вас этого нет, практически нет ничего, что можно было бы сделать с точки зрения программного обеспечения, чтобы что-то быстро работало на устаревшем компьютере. Короче говоря - какая у вас конфигурация MySQL? Вы хотите, чтобы все поместилось в память, чтобы все ваше агрегирование было быстрым. –
@iamtankist Я не считал Эластику. Кажется, есть некоторые проблемы, с которыми люди сталкиваются [этот вопрос] (http://elasticsearch-users.115913.n3.nabble.com/ES-is-slow-when-I-try-to-return-a- огромные-множество результатов td4027757.html). Интересно, все ли так? Вы использовали его сами? Нотабене Мой сервер MySQL сидит на бродячем поле на моей локальной машине, что очень хорошо подходит для других ситуаций. Мне не кажется, что аппаратное обеспечение обязательно является узким местом здесь, однако я могу ошибаться. – Adviov