Структура моих данных следующая:
date: <timestamp>
filter_a: <integer> -> range [0, 1000]
filter_b: <integer> -> range [0, 1000]
filter_c: <integer> -> range [0, 86400]
filter_d: <integer> -> range [0, 6]
group: <string>
second_group: <integer>
variable_a: <float>
variable_b: <float>
variable_c: <float>
a couple more no very important
Мне нужно выполнить следующие запросы:
Первый:
- Фильтрация данных по
date
,filter_a
,filter_b
,filter_c
и др
Во-вторых, с отфильтрованными данными:
- считать все записи
- получить среднее из
variable_a
,variable_b
иvariable_c
- получить стандартное отклонение от
variable_a
,variable_b
иvariable_c
- получить квартили из
variable_a
,variable_b
иvariable_c
- группировать данные по
group
илиsecond_group
и агрегировать (Count, Avg, Std, ..)
Число пользователей системы составляет около 10 или 15, но количество элементов огромен, прямо сейчас 70М , но это будет 500M в течение нескольких недель , и это будет 1000M примерно через год.
Количество запросов небольшое, не более 10 пользователей одновременно, моя проблема в том, как обрабатывать эти запросы с таким огромным количеством данных.
Что я пробовал до сих пор?
Я начал с того
mongodb
, что вначале это было быстро, но стало медленным при расчете квартилей с 10М +. Это улучшилось, когда я добавил индексы, но это не очень помогло, когда мне пришлось запрашивать все данные. Я начал использовать mongodb, потому что данные были очень динамичными, но, к счастью, формат данных «больше не изменится».Как
filter_a
иfilter_b
можно было увидеть как узлы, я попробовалneo4j
. Мне очень понравилось это neo4j, но у моего графа было МНОГО ребер, поэтому запросы не были очень быстрыми.Наконец, поскольку формат данных не собирается меняться и это всего лишь одна коллекция / таблица, поэтому не требуется никаких соединений в SQL, я проверил postgresql. Мои тесты были быстрее с postgresql, но я боюсь, что в будущем он не сможет масштабироваться должным образом.
Что мне нужно?
- Является ли postgresql хорошим выбором для этого случая?
- Могу ли я использовать другую базу данных? какой из них лучше для этого случая?
- Что еще я мог сделать, чтобы улучшить это?
редактировать
- Около 1 млн элементов вставляются каждый день и «не должны меняться» с течением времени.
- Скорость записи не важна
- Сложное требование - быстро читать / агрегировать
Спасибо!