Назад к вопросам
Senior
2
Задача Дано: CREATE TABLE profile ( id BIGSERIAL PRIMARY KEY, nickname VARCHAR, registered_at TIMESTAMP ); CREATE TABLE post ( id BIGSERIAL PRIMARY KEY, owner_id BIGINT REFERENCES profile (id), body TEXT, inserted_at TIMESTAMP, likes_count INT -- кол-во лайков ); CREATE TABLE subscription_count ( profile_id BIGINT REFERENCES profile (id) UNIQUE, followers_count INT, -- кол-во подписчиков following_count INT -- кол-во подписок ); Требуется: select p.id, sc.followers_count from post p join subscription_count sc on sc.profile_id = p.owner_id where sc.followers_count > 500 -- Индекс:create index on post (owner_id) -- Запрос:select * from post where likes_count > ? AND owner_id = ?;
Компании, где спрашивали
ТБанк
Ответ от нейросети
sobes.tech AI
В данной задаче есть три таблицы: profile, post и subscription_count.
Запрос:
select p.id, sc.followers_count
from post p
join subscription_count sc on sc.profile_id = p.owner_id
where sc.followers_count > 500
Этот запрос выбирает посты, владельцы которых имеют более 500 подписчиков.
Индекс:
create index on post (owner_id);
Он ускоряет поиск постов по owner_id.
Однако, если часто выполняется запрос:
select * from post where likes_count > ? AND owner_id = ?;
то стоит создать составной индекс по (owner_id, likes_count), чтобы ускорить фильтрацию по обоим полям:
create index idx_post_owner_likes on post (owner_id, likes_count);
Это позволит эффективно использовать индекс при запросах с фильтрацией по owner_id и likes_count.
Также стоит проверить, что в таблице subscription_count есть индекс по profile_id (уже есть ограничение UNIQUE, значит индекс есть), что ускорит соединение.
Итог:
- Для ускорения запроса с
joinиндекс наpost.owner_idуже есть. - Для запроса с фильтрацией по
likes_countиowner_idлучше создать составной индекс(owner_id, likes_count).
Это улучшит производительность выборок по указанным условиям.