Как грамотно построить sql-запросы в высоко-нагруженных базах?

1. Есть таблица на несколько миллионов пользователей, а также есть таблица с названиями фильмов. Нужно выбрать пары пользователей, у которых есть хотя бы 7 общих фильмов. Думаю сделать отдельные таблицы для пользователей и для фильмов и связать их many-to-many. Это оптимальная архитектура или можно придумать что-нибудь лучше? И как в таком случае должен будет выглядеть оптимальный sql-запрос к базе?

2. Нужно выбрать пользователей из определенного города, со статусом active, и у которых минимум 4 фильма. Опять же, какой запрос будет оптимален?

3. Есть таблица логов, где хранятся данные о том когда пользователь был active (два timestamp - 1. стал active 2. перестал быть active). Надо подсчитать сколько было активных пользователей за определенный период времени.

Все осложняется тем, что данных много и запросов тоже может быть много, нужно с этим справиться.
  • Вопрос задан
  • 2424 просмотра
Пригласить эксперта
Ответы на вопрос 4
alexfilus
@alexfilus
Fullstack разработчик
1. Правильно думаете, только если Вы ищите такие пары среди ВСЕХ пользователей и ВСЕХ фильмов, то тут не обойдётся без полного сканирования всех 3 таблиц. Поможет кеширование, либо функциональные индексы, либо какие-то сводные таблицы управляемые триггерами или materialized view.
2. Active это bool или статус из списка? В любом случае тут нужен индекс по city_id и либо по полю active, либо частичный индекс where active = true. (надеюсь у Вас PostgreSQL)
3. Просто where с 2 условиями? Или есть подвох?

Запросы сложными тут быть не должны, но нужно предусмотреть правильные индексы чтобы это работало быстро.
Если нужна помощь именно с запросами, создайте https://www.db-fiddle.com/ с примерами данных, хотя бы строк по 10, чтобы ясна было структура
Ответ написан
@AlexBergal
Ид активных пользователей надо хранить отдельно. Иначе пересчитывать постоянно индекс по этому полю будет лютая смерть
Ответ написан
2ord
@2ord
продвинутый чайник
1-2 Попробуйте графовые СУБД. Они лучше походят для взаимосвязанных сущностей.
guides.neo4j.com/sandbox/recommendations
3. Наверное, аналитические СУБД.
Ответ написан
@le1ic
Насколько риалта1мными должны быть ответы? задача звучит так, что ее можно было бы обсчитывать раз в день например. Непосредственно для вычисления SQL мне кажется будет здесь неэффективен. Я бы формировал длиннющие битовые строки для каждого пользователя и делал AND, BITCOUNT.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
18 сент. 2020, в 23:09
5000 руб./за проект
18 сент. 2020, в 23:02
900 руб./в час
18 сент. 2020, в 20:16
13000 руб./за проект