Senior
39
Задача Дадено: 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 АИ
В данной задаче есть три таблицы: 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).
Это улучшит производительность выборок по указанным условиям.