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-шпаргалку или список вопросов по индексам для собеседований.