[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-sql-kakie-tipy-indeksov-sushchestvuyut-i-kogda-kakoy-ispolzovat":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":15,"progress":16,"seo":17},877,"kakie-tipy-indeksov-sushchestvuyut-i-kogda-kakoy-ispolzovat",25,"sql","SQL","🗃️","Какие типы индексов существуют и когда какой использовать?","Индекс — структура данных, ускоряющая поиск строк в таблице за счёт дополнительного расхода на запись и хранение. В PostgreSQL поддерживается несколько типов индексов, каждый из которых оптимален для определённых сценариев.\n\n### Основные типы индексов\n\n| Тип | Операторы | Когда использовать |\n|-----|----------|-------------------|\n| B-tree | `=`, `\u003C`, `>`, `\u003C=`, `>=`, `BETWEEN`, `IN`, `LIKE 'prefix%'` | Универсальный, по умолчанию |\n| Hash | Только `=` | Точный поиск без сортировки |\n| GIN | `@>`, `@@`, `?`, `?&` | Полнотекстовый поиск, JSONB, массивы |\n| GiST | `\u003C\u003C`, `>>`, `\u003C->`, `&&` | Геоданные, диапазоны, KNN |\n| BRIN | Диапазонные запросы | Огромные таблицы с физической упорядоченностью |\n\n### B-tree (сбалансированное дерево)\n\nТип по умолчанию. Подходит для большинства случаев: сравнения, сортировка, поиск по префиксу.\n\n```sql\nCREATE INDEX idx_emp_name ON employees(name);\n-- Эквивалентно: CREATE INDEX idx_emp_name ON employees USING btree(name);\n```\n\n### Hash\n\nОптимален только для `=`. Не поддерживает сортировку и диапазоны. В PostgreSQL 10+ crash-safe.\n\n```sql\nCREATE INDEX idx_emp_email ON employees USING hash(email);\n```\n\n### GIN (Generalized Inverted Index)\n\nИнвертированный индекс для значений, содержащих несколько элементов.\n\n```sql\n-- Полнотекстовый поиск\nCREATE INDEX idx_articles_fts ON articles USING gin(to_tsvector('russian', content));\n\n-- JSONB\nCREATE INDEX idx_data_jsonb ON events USING gin(metadata jsonb_path_ops);\n\n-- Массивы\nCREATE INDEX idx_tags ON posts USING gin(tags);\n```\n\n### GiST (Generalized Search Tree)\n\nОбобщённое дерево поиска для геометрических данных, диапазонов, полнотекстового поиска.\n\n```sql\n-- Геоданные (PostGIS)\nCREATE INDEX idx_locations ON places USING gist(coordinates);\n\n-- Поиск ближайших соседей (KNN)\nSELECT name, coordinates \u003C-> point(55.75, 37.62) AS distance\nFROM places\nORDER BY coordinates \u003C-> point(55.75, 37.62)\nLIMIT 5;\n```\n\n### BRIN (Block Range Index)\n\nХранит сводную информацию о диапазонах значений в физических блоках. Очень компактный, но эффективен только для данных с физической корреляцией (данные отсортированы на диске).\n\n```sql\nCREATE INDEX idx_events_date ON events USING brin(created_at);\n```\n\n### Специальные виды индексов\n\n#### Составные (композитные)\n\n```sql\nCREATE INDEX idx_emp_dept_salary ON employees(department, salary);\n```\n\nПорядок столбцов важен. Индекс `(department, salary)` эффективен для `WHERE department = 'IT'`, но не для `WHERE salary > 50000` без фильтрации по department. Правило: столбцы с `=` ставить первыми, затем — с диапазонными условиями.\n\n#### Частичные (partial)\n\n```sql\nCREATE INDEX idx_active_users ON users(email) WHERE status = 'active';\n```\n\nИндексируют только строки, удовлетворяющие условию — меньше размер, быстрее обновление.\n\n#### Покрывающие (covering) — INCLUDE\n\n```sql\nCREATE INDEX idx_emp_dept_covering ON employees(department) INCLUDE (name, salary);\n```\n\nДобавляют столбцы в индекс для обеспечения Index Only Scan без обращения к таблице.\n\n### Когда НЕ нужно создавать индекс\n\n- Таблица маленькая (менее нескольких тысяч строк) — Seq Scan будет быстрее\n- Столбец имеет очень низкую селективность (например, `gender` с 2 значениями)\n- Таблица очень часто обновляется — каждый INSERT\u002FUPDATE\u002FDELETE обновляет все индексы\n- Столбец редко используется в `WHERE`, `JOIN`, `ORDER BY`\n\n### Частые ошибки\n\n- Создание индекса на каждый столбец — замедляет запись без пропорционального ускорения чтения\n- Неправильный порядок столбцов в составном индексе — индекс не используется\n- Функция в `WHERE` без функционального индекса: `WHERE LOWER(name) = 'ivan'` не использует обычный индекс на `name`\n- B-tree для полнотекстового поиска или JSONB — нужен GIN\n\n> **На собеседовании:** назовите 4-5 типов индексов и для каждого приведите пример использования. Обязательно упомяните составные, частичные и покрывающие индексы. Частая ошибка — знать только B-tree и не уметь подобрать тип индекса под задачу.","","middle",[7],[],null,{"title":18,"description":19,"ogTitle":18,"ogDescription":20,"keywords":21,"schemaAnswer":22,"featuredSnippetReady":23},"Какие типы индексов существуют и когда какой использовать? — Gymterview","Индекс — структура данных, ускоряющая поиск строк в таблице за счёт дополнительного расхода на запись и хранение. В PostgreSQL поддерживается несколько типов ин","Индекс — структура данных, ускоряющая поиск строк в таблице за счёт дополнительного расхода на запись и хранение. В Post",[7,13],"Индекс — структура данных, ускоряющая поиск строк в таблице за счёт дополнительного расхода на запись и хранение. В PostgreSQL поддерживается несколько типов индексов, каждый из которых оптимален для определённых сценариев.",true]