620просмотров
53.0%от подписчиков
10 марта 2026 г.
📷 ФотоScore: 682
Индексы на NULL работают не так, как индексы на значения В большинстве БД NULL не равен ничему, включая другой NULL. Это ломает интуицию при работе с индексами. CREATE INDEX idx_deleted_at ON orders(deleted_at); -- использует индекс
SELECT FROM orders WHERE deleted_at = '2024-01-01'; -- НЕ использует индекс в некоторых БД
SELECT FROM orders WHERE deleted_at IS NULL; PostgreSQL индексирует NULL и использует индекс для IS NULL. MySQL InnoDB — тоже. Но Oracle по умолчанию не включает NULL в B-tree индексы. Partial index — мощная оптимизация для nullable колонок: -- индекс только на активные записи
CREATE INDEX idx_active_orders ON orders(created_at) WHERE deleted_at IS NULL; Индекс меньше, запросы по активным заказам быстрее. Но работает только для запросов с тем же условием WHERE. Ещё ловушка в составных индексах: CREATE INDEX idx_user_status ON orders(user_id, status); -- использует индекс
SELECT FROM orders WHERE user_id = 1 AND status = 'pending'; -- использует частично (только user_id)
SELECT FROM orders WHERE user_id = 1; -- НЕ использует (leftmost prefix rule)
SELECT * FROM orders WHERE status = 'pending'; Порядок колонок в составном индексе очень важен. Ставьте первыми колонки, которые чаще в WHERE с равенством. EXPLAIN ANALYZE поможет. Не гадайте, используется ли индекс — проверяйте. #backendvk #databases #highload