INDEX (индекс)
Структура данных, ускоряющая поиск строк по значению колонки.
CREATE INDEX [CONCURRENTLY] idx_name ON table (column);
CREATE INDEX ON table (col1, col2); -- составнойОбъяснение
Пример
-- Простой индекс
CREATE INDEX ON users (email);
-- Составной (порядок важен!)
CREATE INDEX ON orders (user_id, created_at DESC);
-- Частичный — только активные
CREATE INDEX ON users (email) WHERE is_active = true;Связанные термины
Анекдоты по теме
— Что такое index bloat? — Индекс «раздувается» со временем из-за мёртвых версий строк. — Как проверить? — pgstattuple расширение: SELECT * FROM pgstatindex('idx_name'); — Как исправить? — REINDEX CONCURRENTLY idx_name; — перестраивает без блокировки. — VACUUM не помогает? — Помогает частично. Тяжёлый bloat — REINDEX.
Django ORM и дата: User.objects.filter(created_at__year=2024) SQL: WHERE EXTRACT(year FROM created_at) = 2024 — Но это функция на колонке! — Индекс не использует? — Нет. Для больших таблиц лучше: .filter(created_at__gte=date(2024,1,1), created_at__lt=date(2025,1,1))
Junior пишет: WHERE YEAR(created_at) = 2024 AND MONTH(created_at) = 1 Senior переписывает: WHERE created_at >= '2024-01-01' AND created_at < '2024-02-01' — В чём разница? — Первый вариант не использует индекс. Функция от колонки = нет индекса.