Индексы и селективность (PostgreSQL) 5

Posted by Андрей on Июнь 03, 2008

Индекс по полю в БД потенциально может ускорить SELECT операцию с условием по данному полю, может ускорить заброс вида: ORDER BY поле LIMIT 20, но индекс замедляет существенно операции изменения таблицы и т.п.

Когда нужен индекс, когда он поможет и будет использован при SELECTах? Всё зависит от селективности индекса, т.е. от кол-ва строк, которые мы получим если зададим условие

проиндексированное_поле = значение

Отличный кандидат для индексирования – селективность 1, т.е. уникальный индекс (например, id), когда по указанному значению мы найдем максимум одну запись. Хорошо, когда селективность составляет < 5% (например, поле city_id у пользователя). При этом PostgreSQL умён, он считает не селективность «вообще», а селективность в виде гистограммы по отдельным значениям поля. Т.е. если мы задаем условие вида

страна = Россия

то получим 10% записей из БД, а если условие

страна = Уругвай

то получим 2 записи, и это PostgreSQL понимает.

Так вот, если селективность плохая (получим много записей), PostgreSQL предпочтёт выполнить полное сканирование БД, не используя индекс. И такой индекс только мешает.

Trackbacks

Use this link to trackback from your own site.

Comments

Leave a response

  1. zakhar Вт, 03 Июн 2008 22:50:40 UTC

    Как раз сегодня с этим столкнулся :-) долго пытался понять отчего же «тупой» постгрес не хочет использовать индекс по таймстампу при выборке за последний час… оказалось ошибся в циферке месяца и пытался выбрать не за час а за месяц из таблички в которой всего месяц и хранится :-) )

  2. Виктор Вт, 17 Июн 2008 16:16:53 UTC

    Было бы интересно узнать поподробнее

  3. Андрей Вт, 17 Июн 2008 16:20:02 UTC

    Какой именно момент? Это так или иначе описано в документации к PostgreSQL. Наверное, я бы смог ответить на конкретный вопрос.

  4. David Вт, 30 Сен 2008 23:57:37 UTC

    Автор да у вас похоже талант, реально здорово пишите.

  5. Vaservan Ср, 21 Янв 2009 13:03:33 UTC

    Хм… забавненько

Comments