Индекс на булевом поле в PostgreSQL: мнимая оптимизация
Индекс на булевом поле в PostgreSQL: мнимая оптимизация Поставить индекс на колонку, где хранится только true или false (например, поле is_active для таблицы users), — это классика. Разработчик гордится проделанной "оптимизацией", но на деле это только пустая трата места на диске. Почему это бесполезно? Дело в том, что булево поле имеет всего два (с учётом NULL — три) возможных значения. Индекс с такой низкой кардинальностью не позволяет эффективно отсеять данные — оптимизатор всё равно предпочтет полное сканирование таблицы, потому что это будет дешевле. А что же делать? Выход есть — частичный индекс (CREATE INDEX ... WHERE ...). Он индексирует только те строки, которые вам реально нужны. Например, если в таблице с пользователями большинство строк принадлежат уже активированным пользователям (is_active = true), а вы часто ищете только неактивированых (is_active = false), создайте индекс именно для них: ```sql CREATE INDEX idx_inactive ON users (user_id) WHERE is_active IS FALSE; ``` Внимание: IS и = для булевых значений — не одно и то же! Для NULL они ведут себя по-разному. Если Вы создали частичный индекс с WHERE is_active IS FALSE, а в запросе напишете WHERE is_active = FALSE — частичный индекс не будет использован. Планировщик PostgreSQL весьма строг к буквальному совпадению условий 😈 P.S: Друзья, ждём Вас 20 августа покушать с нами пиццу в нашем офисе! 🍕 🔗 Регистрируйтесь по ссылке тут