TGViewer
SQL Ready | Базы Данных SQL Ready | Базы Данных @sql_ready · 17.5K subscribers
Post #2030 1.64K
Индексы по выражениям — ускоряем поиск по вычисляемым значениям!

Обычный индекс работает только тогда, когда база может сравнить значение напрямую с колонкой. Если в условии WHERE применяется функция к полю, оптимизатор часто не может использовать обычный индекс.

Таблица:
users(id, email)


Создадим индекс на email:
CREATE INDEX idx_users_email
ON users(email);


Теперь простой поиск по точному значению использует этот индекс:
SELECT *
FROM users
WHERE email = 'test@mail.com';


Но в реальных проектах часто нужна нормализация данных. Например, искать email без учёта регистра через LOWER():
SELECT *
FROM users
WHERE LOWER(email) = 'test@mail.com';


Проблема в том, что PostgreSQL должен применить LOWER() к каждой строке, а потом сравнить результат. Обычный индекс по email для такого условия уже не подходит.

Решение — создать индекс не на колонку, а на результат выражения:
CREATE INDEX idx_users_lower_email
ON users(LOWER(email));


Теперь база хранит вычисленные значения в индексе и может быстро находить совпадения:
EXPLAIN ANALYZE
SELECT *
FROM users
WHERE LOWER(email) = 'test@mail.com';


Та же техника работает и для других преобразований. Например, если часто ищем заказы по году создания:
CREATE INDEX idx_orders_year
ON orders(EXTRACT(YEAR FROM created_at));


Теперь запросы по этому выражению могут использовать индекс вместо полного прохода таблицы.

Индекс нужно создавать под реальные запросы. Лишние увеличивают время INSERT/UPDATE и занимают место.

🔥 Индексы по выражениям полезны, когда одно и то же вычисление постоянно используется в WHERE, JOIN или ORDER BY.

➡️ SQL Ready | #практика
  • ❤ 16
  • 👍 8
  • 🔥 8
More from @sql_ready
  1. Oct 5, 2026COUNT(*) в PostgreSQL: MVCC, visibility map и стоимость выполнения! В PostgreSQL точный CO…
  2. Oct 5, 2026Как оплачивать зарубежные сервисы в 2026 году? Можно бегать между посредниками и бояться б…
  3. Oct 5, 2026Проверяйте JSON без преобразования! Если JSON приходит как text, необязательно делать ::js…
  4. Oct 2, 2026Настройте оценку пользовательских функций! Для пользовательской функции PostgreSQL позволя…
  5. Oct 2, 2026😍 SQL-Tutorial — бесплатный учебник по SQL с практическими заданиями! Онлайн-учебник для…
  6. Oct 1, 2026🐱 PostgreSQL Course RU — курс по PostgreSQL и SQL для разработчиков! В репозитории собран…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →