Время чтения: 2 min
Изменено:18.09.2026, 19:57:57
Индексирование
Индексирование (index) — это специальная структура, которая хранит ссылки на данные в БД в определенном порядке. Используется для ускорения работы запросов.
Плюсы:
- Ускорение запросов(
select,join,order by, ...) - Уменьшает нагрузку на частые выборки данных
Минусы:
- Занимает место на диске
- Замедляет работу DML (
insert,update,delete), так как при манипулировании данными индексы тоже должны обновляться.
Общий вид:
create index ВИД Имя on ИДТ ТИП(ИДС)
Пример:
create index ind632 on gr632(фамилия)
Виды:
- Одинарный - индекс на один столбец Общий вид:
create index ВИД Имя on ИДТ ТИП(ИДС)
Пример:
create index ind632 on gr632(фамилия)
- Составной - создание индекса на несколько столбцов(1 таблицы)
Общий вид:
create index ВИД Имя on ИДТ ТИП(ИДС,ИДС,ИДС)
Пример:
create index ind632 on gr632(фамилия,имя)
- Уникальный индекс — индекс, который создаётся уникальным (то есть в столбец нельзя добавить строки с одинаковыми значениями).
Общий вид:
create unique index Имя on ИДТ(ИДС)
Пример:
create unique index gr632inq on gr632(возраст)
- По выражению — это индекс, который создан с выражением (выражение может быть агрегатной функцией), которое будет выполняться быстрее.
Общий вид:
create index Имя on ИДТ(АГР-Ф(ИДС))
Пример:
create index ind632vir on gr632(фамилия)
Типы index:
- B-tree (default)
- Самый частый.
- Хорошо работает с операторами «больше», «меньше», равенством и
between.
create index индф on ИДТ(ИДС)
- Hash
- Индекс по хэшу
- Подходит только для равенства.
- Работает в равенствах быстрее, чем B-tree.
Общий вид:
create index ИНДФ on ИДТ using hash(ИДС)
Пример:
create table gr632hash on gr632 using hash(id)
- GIN — используется для поиска по массивам или полнотекстового поиска, лучше работает по множеству значений.
- По массивам
create index ИНДФ on ИДТ using GIN(ИДС)
Пример:
create index gr632_GIN_1 on gr632 using GIN("Дата")
- По полнотекстовому
create index ИНДФ on ИДТ using GIN(to_tsvector('знач', ИДС))
Пример:
create index gr632_GIN_1 on gr632 using GIN(to_tsvector('Иванов', Фамилия))
- GiST
- Более гибкий, чем GIN.
- Используется чаще всего для геоданных.
Общий вид: create index ИНДФ on ИДТ using GIst(ИДС)
Пример:
create index gr632_GIN_1 on gr632 using Gist('Иванов', Фамилия)
- Brin
Хранит в себе не ссылку на каждую строку, а диапазоны значений.
Общий вид:
create index ИНДФ on ИДТ using brin(ИДС)
Пример:
create index gr632_GIN_1 on gr632 using brin('Иванов', Фамилия)
Индексы хранятся в спец. таблицы pg_indexes
Для того чтобы посмотреть есть ли на таблице индексы делается запрос
select * from pg_indexes where tablename = ''
Для проверки работы индекса используется explain
explain — не выполняет запрос, но выводит план выполнения запроса
analyze — позволяет увидеть реальное время
create index p_index on p (название);
explain analyse select название from p;