Как оптимизировать SQL-запрос, чтобы найти самое длинное видео среди топ-10 коротких?

Оптимизация запроса: самое длинное видео среди топ-10 коротких Контекст: SQL-запросы предназначены для поиска видео и сортировки результатов по длительности Основная задача: определить самое длинное видео среди…

Короткий ответ

Что ответить на собеседовании

Оптимизация запроса: самое длинное видео среди топ-10 коротких Контекст: SQL-запросы предназначены для поиска видео и сортировки результатов по длительности Основная задача: определить самое длинное видео среди коротких, предварительно оставив только 10 лучших результатов по длине Главный принцип: разделить обработку на два этапа — сначала получить топ-10 коротких видео, а затем выбрать из них самое длинное Для выделения топ-10 коротких видео применить подзапрос или CTE (WITH), отсортировав записи по длительности — по возрастанию либо по другому критерию, определяющему "короткие" видео Во внешнем запросе выбрать из результата подзапроса…

Подробный разбор

Ответ с пояснениями

Оптимизация запроса: самое длинное видео среди топ-10 коротких

  • Контекст: SQL-запросы предназначены для поиска видео и сортировки результатов по длительности
  • Основная задача: определить самое длинное видео среди коротких, предварительно оставив только 10 лучших результатов по длине
  • Главный принцип: разделить обработку на два этапа — сначала получить топ-10 коротких видео, а затем выбрать из них самое длинное
  • Для выделения топ-10 коротких видео применить подзапрос или CTE (WITH), отсортировав записи по длительности — по возрастанию либо по другому критерию, определяющему "короткие" видео
  • Во внешнем запросе выбрать из результата подзапроса видео с наибольшей длительностью
  • Для повышения скорости создать и задействовать индекс по длине видео, например по полю duration или length
  • Важно сократить объём данных в подзапросе, чтобы избежать полной сортировки всей таблицы
  • В PostgreSQL это можно реализовать следующим образом sql WITH TopShortVideos AS ( SELECT * FROM videos WHERE duration < <короткий_порог> ORDER BY duration ASC LIMIT 10 ) SELECT * FROM TopShortVideos ORDER BY duration DESC LIMIT 1;
  • Такой вариант сначала эффективно ограничивает выборку десятью видео с наименьшей длительностью, а затем быстро находит среди них запись с максимальной длиной
  • Если требуются дополнительные фильтры или условия, альтернативой могут стать оконные функции (ROW_NUMBER/PARTITION)
  • Итоговый подход сочетает поэтапную обработку, индексы и минимальный объём данных, передаваемых во внешний запрос

В результате база данных вернёт ответ быстро и с минимальной нагрузкой.

Подробный ответ

Основной ответ

Для оптимизации запроса, который должен найти самое длинное видео среди топ-10 коротких, сначала необходимо однозначно задать критерий "коротких" и определить принцип отбора — например, по рейтингу, дате или числу просмотров. Предполагается, что у видео есть отдельная метрика ранжирования, например популярность, и требуется найти максимальную длительность среди десяти лучших видео с небольшой продолжительностью. Основная оптимизация заключается в сокращении объёма обрабатываемых данных и правильном использовании индексов.

Ключевые моменты

  • Выборка ограниченного поднабора: на первом этапе получить топ-10 коротких видео, например ORDER BY rating DESC LIMIT 10 при условии duration < X, чтобы уменьшить объём данных для дальнейшего поиска.
  • Индексация полей: создать индекс по длительности (duration) и по полю, используемому для формирования топ-10, например rating. Это ускорит фильтрацию и сортировку.
  • Использование подзапроса или CTE: не следует искать максимальную длительность сразу по всей таблице. Сначала нужно сформировать поднабор из топ-10 коротких видео, а затем выбрать из него самое длинное.
  • Минимизация количества обрабатываемых строк: если не ограничить результат топ-10, СУБД может выполнить полный скан таблицы.

Пример SQL для PostgreSQL 14+:

WITH top_short_videos AS (
SELECT * FROM videos
WHERE duration < 300 -- критерий "коротких" в секундах
ORDER BY rating DESC
LIMIT 10
)
SELECT * FROM top_short_videos
ORDER BY duration DESC
LIMIT 1;

Практический контекст

В реальных проектах с большими каталогами видео особенно важно правильно настроить индексы — например, B-tree по duration и rating. Иногда топ-10 коротких видео кэшируют в Redis, чтобы мгновенно находить среди них самое длинное и уменьшать нагрузку на БД. При редко изменяющихся данных также применяют материализованные представления: это помогает повысить производительность и снизить latency. Для подобных запросов в продакшене хорошим результатом считается показатель около ~50ms.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку