intermediate

Index types

Выбирайте B-tree, GIN, GiST, BRIN, partial, expression и composite indexes по access path.

В PostgreSQL больше семейств индексов, чем B-tree по умолчанию. Выбирайте тип под предикат запроса, а не под имя колонки.

| Тип индекса | Типичное применение | |-------------|---------------------| | B-tree (default) | Равенство, диапазоны, ORDER BY по скалярам | | GIN | JSONB containment, массивы, полнотекст | | GiST | Геометрия, диапазоны, nearest-neighbor | | BRIN | Очень большие упорядоченные таблицы (time series) | | Hash | Legacy только равенство; редко лучше B-tree |

Частичные индексы снижают стоимость записи, когда запросы всегда фильтруют одинаково:

					CREATE INDEX idx_orders_open ON orders (created_at)
  WHERE status = 'open';

CREATE INDEX idx_users_email_lower ON users (lower(email));
				

Порядок колонок в составном индексе: сначала equality-фильтры, затем range/sort. Expression index нужен, когда в запросе к колонке применяется функция.

На интервью: назовите access path (равенство vs диапазон vs containment), объясните, почему GIN подходит для JSONB/@>, но не для каждой колонки, и упомяните стоимость индексов при записи.

Типовые ошибки: индекс на каждую колонку; GIN на низкокардинальные boolean; неверный порядок в composite; игнор partial indexes для «горячих» подмножеств.

Компромисс — скорость чтения против усиления записи, объёма хранения и сюрпризов планировщика; меньше точечных индексов обычно лучше «ковра» из индексов.

Чеклист:

  • Сопоставьте семейство индекса с формой предиката.
  • Partial indexes — для стабильных подмножеств фильтра.
  • В composite сначала equality, потом range.
  • Проверяйте через EXPLAIN (ANALYZE, BUFFERS).