Задать вопрос
@UserAgreement

Как организовать фильтрацию в БД по сложным фильтрам?

Раньше писал простые фильтры по одному-двум полям, но сейчас у меня стоит задача реализовать фильтрацию по множеству полей в базе `postgreSQL`.
На клиенте имеется форма с полями фильтров.... Что-то по типу того, что в яндекс-маркете.
Не могу представить как смоделировать всю логику, как задать индексы и т.д.
Вот предположим у меня есть следующие поля: age, first_name, sex, country, city, last_seen_at и прочие.
Разве правильным решением будет задать состовной индекс для всех этих полей? Ведь индекс будет очень жирным в таком случае. Более того, поле `last_seen_at` часто будет обновляться и как это может отразиться на производительности, если в БД будет 100 миллионов пользователей?
Мне кажется, что я что-то упускаю и такие вещи вообще решаются другим(и) инструментами или при помощи вспомогательных таблиц...
В общем, хотелось бы перенять опыт тех, кто с этим сталкивался и балогополучно решал таких задачки. Куда мне копать? Что изучать?
  • Вопрос задан
  • 102 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Everything_is_bad
Нет тут серебряной пули, включай логирование медленных запрос, анализируй его, по результатам создавай нужные индексы. Еще можно создать тестовый стенд и прогонять по нему самые распространенные запросы с нужным тебе rps, с посредствующим анализов лога медленных запрос и оптимизаций
Ответ написан
AshBlade
@AshBlade
Просто хочу быть счастливым
В таких ситуациях надо делать так:

- Реализуем систему генерации нужного запроса с фильтрами
- На БД делаем возможность отслеживать запросы (время выполнения, частота использования и т.д.)
- Запускаем пользователей
- Собираем статистику по запросам
- Выявляем какие фильтры используются чаще всего
- Делаем индексы для этих выражений

Замечания:
- В postgres отслеживать запросы можно расширением pg_stat_statement. А вообще рекомендую главу 3 Мониторинг PostgreSQL
- Я сказал "индексы для выражений", т.к. скорее всего у тебя будут не простые поля, а именно выражения - Postgres позволяет по ним делать индекс
- Сколько времени собирать статистику - решай сам. например, как только все запросы начнут деградировать (не рекомендую до такого доводить)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы