Шпаргалка по типам индексов SQL, шаблонам проектирования и обслуживанию.
Индексы меняют хранение и скорость записи на скорость чтения. Выберите структуру, ограничьте строки и следите за раздуванием.
Справочная таблица · 31 записи
Индексы SQLExplained
31 of 31 rows
Типы индексов
Сбалансированное дерево для равенств, диапазонов и сортированных обходов. Выбор по умолчанию в большинстве баз данных.
Используйте для =, <, >, BETWEEN, ORDER BY. Не для полнотекстового поиска.
Индекс, у которого уровень листьев — сама таблица. Строки хранятся в порядке ключа. Один на таблицу.
InnoDB кластеризует по первичному ключу. Таблицы SQL Server без него — кучи (heaps).
Отдельная структура с ключами и указателем обратно на базовую таблицу. Много на таблицу.
В куче хранит ID строки. В кластеризованной таблице хранит ключ кластеризации.
Хеш-таблица только для поисков по равенству. Точное совпадение за постоянное время.
Используйте только для операций =; диапазонам и сортировке нужен B-tree. Хеш для оптимизированных под память таблиц SQL Server требует число корзин, близкое к числу строк.
Обобщённый инвертированный индекс. Отображает значения на строки. Создан для массивов и полнотекстового поиска.
Используйте для jsonb, массивов, tsvector и триграммного поиска. Строится медленнее B-tree.
Обобщённое дерево поиска. Расширяем для нескалярных типов и запросов на пересечение.
Используйте для геометрических диапазонов, kNN и ограничений-исключений. pg_trgm ускоряет LIKE.
GiST с разбиением пространства. Делит данные на непересекающиеся области через radix- или квадродеревья.
Используйте для точек, IP-префиксов и поиска по префиксу. Не для запросов на пересечение; берите GiST.
Индекс диапазонов блоков. Хранит min/max на диапазон блоков. Крошечный размер.
Используйте на больших физически отсортированных таблицах. Дёшево построить, слабая селективность.
Индекс, хранящийся сегментами по столбцам вместо строк. Высокое сжатие, пакетное исполнение.
Используйте для аналитических обходов по многим строкам и малому числу столбцов. Поиск одной строки медленный.
Выделенный инвертированный словарный индекс в MySQL и SQL Server. Строится на текстовый столбец.
Используйте MATCH AGAINST или CONTAINS. Полнотекстовый поиск Postgres вместо этого использует GIN по tsvector.
Индекс Oracle, хранящий по одной битовой карте на каждое отдельное значение. Каждый бит отмечает одну строку.
Используйте на столбцах с низкой кардинальностью в хранилищах, нагруженных чтением. Параллельные записи сериализуются по битовой карте.
Столбец индекса объявлен DESC. Ключи этого столбца хранятся в обратном порядке.
Нужен для смешанных сортировок вроде (a ASC, b DESC). Простые сортировки DESC могут читать обычный индекс и в обратную сторону.
Индекс MySQL 8, который оптимизатор игнорирует. При этом поддерживается при каждой записи.
Скройте индекс перед удалением, чтобы оценить влияние. Верните видимость без перестройки.
Проектирование
Составной индекс по нескольким столбцам. Ведущие столбцы должны совпадать с порядком фильтров запроса.
Сначала столбцы равенства, затем диапазоны. Два одиночных индекса не заменят один составной.
Индекс по предикату WHERE. SQL Server называет его отфильтрованным индексом. Покрывает только подходящие строки.
Индексируйте только строки с active='t'. Вдвое меньше размер и стоимость записи.
B-tree с добавленными дополнительными столбцами вне ключа. Обходы только по индексу избавляют от обращений к куче.
Добавляйте часто извлекаемые столбцы через INCLUDE. Индекс остаётся сортируемым.