Sobes.tech
Назад к вопросам
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).

Это улучшит производительность выборок по указанным условиям.