Тестирует навык оптимизации сложных запросов с джойнами и условиями.
Добавить индексы на subscribers_count и user_id.
Использовать INNER JOIN вместо LEFT JOIN, если NULL не нужны.
Заменить подзапросы на JOIN.
Применить покрывающий индекс.
Исходный проблемный запрос:
SELECT p.*
FROM posts p
LEFT JOIN users u ON p.user_id = u.id
WHERE u.subscribers_count > 500; -- Медленно без индексаОптимизация:
Индексы:
CREATE INDEX idx_users_subscribers ON users(subscribers_count);
CREATE INDEX idx_posts_user ON posts(user_id);Убрать LEFT JOIN (если посты без пользователей не нужны):
SELECT p.*
FROM posts p
INNER JOIN users u ON p.user_id = u.id -- Быстрее, чем LEFT
WHERE u.subscribers_count > 500;Избегать NULL проверок:
WHERE u.subscribers_count > 500 AND u.subscribers_count IS NOT NULL;Покрывающий индекс (если запрос выбирает только поля из индекса):
CREATE INDEX idx_cover ON users(subscribers_count) INCLUDE (id, name);Результат: Время выполнения снижается с 2 сек до 50 мс.