Python
Junior
a
Какие есть индексы в PostgreSQL
Ответы
Ок, убираю иконки и форматирование. Оставляю только обычный текст, таблицы и код.
---
Индексы в PostgreSQL
1. B-tree (по умолчанию)
2. Hash
3. GIN (Generalized Inverted Index)
4. GiST (Generalized Search Tree)
5. SP-GiST (Space-Partitioned GiST)
6. BRIN (Block Range Index)
---
Варианты индексов (по способу создания)
7. UNIQUE
8. Composite / Multicolumn
9. Partial (частичный)
10. Expression (по выражению)
---
Расширения, используемые с индексами
11. pg_trgm (для LIKE '%text%', similarity)
12. btree_gin
13. btree_gist
---
Быстрая шпаргалка
= / > / ORDER BY → B-tree
JSONB, ARRAY, FTS → GIN
%like%, гео, range → GiST
Большие таблицы по дате → BRIN
---
В PostgreSQL есть несколько типов индексов. Каждый решает свою задачу.
B-tree
Используется для =, <, <=, >, >=, BETWEEN, ORDER BY, LIKE 'abc%'
```sql
CREATE INDEX idx_users_email
ON users (email);
```
Особенности
поддерживает UNIQUE
подходит для большинства кейсов
используется для PRIMARY KEY
---
Hash
Используется только для =
```sql
CREATE INDEX idx_users_id_hash
ON users USING HASH (id);
```
Минусы
не работает с диапазонами
редко быстрее B-tree
почти не используется
---
GIN
Используется для ARRAY, JSONB, tsvector, операторов @>, ?, &&
```sql
CREATE INDEX idx_docs_data
ON documents USING GIN (data);
```
```sql
CREATE INDEX idx_posts_tsv
ON posts USING GIN (to_tsvector('russian', content));
```
Применение
поиск по JSON
теги и массивы
полнотекстовый поиск
---
GiST
Используется для геоданных, диапазонов, LIKE '%abc%', similarity
```sql
CREATE INDEX idx_locations_geom
ON locations USING GIST (geom);
```
```sql
CREATE INDEX idx_name_trgm
ON users USING GIST (name gist_trgm_ops);
```
---
SP-GiST
Используется для иерархий, IP-адресов, префиксов
```sql
CREATE INDEX idx_ip
ON connections USING SPGIST (ip);
```
---
BRIN
Используется для очень больших таблиц с естественным порядком данных
```sql
CREATE INDEX idx_orders_created
ON orders USING BRIN (created_at);
```
Плюсы
минимальный размер
быстро создаётся
Минусы
менее точный, чем B-tree
---
Partial index
Индекс только на часть строк
```sql
CREATE INDEX idx_active_users
ON users (email)
WHERE active = true;
```
---
Composite / Multicolumn
Индекс по нескольким колонкам
```sql
CREATE INDEX idx_orders_user_date
ON orders (user_id, created_at);
```
Важно
работает слева направо
(a, b) не равно (b, a)
---
Expression index
Индекс по выражению
```sql
CREATE INDEX idx_lower_email
ON users (LOWER(email));
```
```sql
SELECT *
FROM users
WHERE LOWER(email) = 'test@mail.com';
```
---
Unique index
Гарантирует уникальность
```sql
CREATE UNIQUE INDEX idx_users_email_unique
ON users (email);
```
---
Шпаргалка выбора индекса
| Задача | Индекс |
| ----------------------- | -------------- |
| Поиск по =, >, ORDER BY | B-tree |
| JSONB, ARRAY | GIN |
| Полнотекстовый поиск | GIN |
| %like% | GiST + pg_trgm |
| Огромные таблицы | BRIN |
| Только часть данных | Partial |
| LOWER, вычисления | Expression |
| Геоданные | GiST |
| Уникальность | UNIQUE |
---
Важные нюансы
Индекс не всегда ускоряет запросы
WHERE должен совпадать с выражением индекса
Много индексов замедляют INSERT и UPDATE
Всегда проверяй план выполнения
```sql
EXPLAIN ANALYZE
```
Если нужно, могу подготовить версию для печати, PDF-шпаргалку или список вопросов по индексам для собеседований.