Идея: не просто добавить индекс на один столбец, а так подобрать порядок полей, чтобы запрос вообще не ходил в таблицу, а читал всё из индекса. Это даёт огромный буст на "горячих" таблицах.
Допустим, у тебя часто есть такой запрос:
SELECT
id,
created_at,
total_amount
FROM orders
WHERE user_id = 123
AND status = 'paid'
ORDER BY created_at DESC
LIMIT 20;
Типичная ошибка - делать что-то вроде:
CREATE INDEX idx_orders_user ON orders (user_id);
CREATE INDEX idx_orders_status ON orders (status);
CREATE INDEX idx_orders_created ON orders (created_at);
Планировщику всё равно приходится лазить в таблицу и склеивать условия. Гораздо эффективнее один правильный составной индекс:
CREATE INDEX idx_orders_user_status_created_at
ON orders (user_id, status, created_at DESC)
INCLUDE (total_amount);
Почему это полезно:
user_id, status - фильтруют строки
created_at DESC - сразу даёт нужный порядок для ORDER BY ... DESC
INCLUDE (total_amount) - позволяет взять сумму прямо из индекса
В результате PostgreSQL (и другие СУБД с подобной механикой) могут сделать index-only scan: прочитать подходящие строки в нужном порядке из одного индекса и почти не трогать основную таблицу.