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

Запросы сложными тут быть не должны, но нужно предусмотреть правильные индексы чтобы это работало быстро. 
Если нужна помощь именно с запросами, создайте https://www.db-fiddle.com/ с примерами данных, хотя бы строк по 10, чтобы ясна было структура
Ид активных пользователей надо хранить отдельно. Иначе пересчитывать постоянно индекс по этому полю будет лютая смерть