Какие знаешь типы индексов
Индексы в базах данных — это структуры данных, используемые для ускорения поиска и выборки строк из таблиц. Они функционируют как указатели, позволяя СУБД быстрее находить нужные данные без необходимости полного сканирования таблицы. В зависимости от СУБД (например, PostgreSQL, MySQL, Oracle, SQL Server), типы индексов могут отличаться по реализации и возможностям. Ниже представлены основные и специальные типы индексов, которые применяются в современных реляционных СУБД.
🔹 1. B-Tree индекс (Balanced Tree)
Это наиболее распространённый тип индекса. Используется по умолчанию в большинстве СУБД (например, PostgreSQL и MySQL/InnoDB).
Особенности:
-
Эффективен для поиска, сортировки, диапазонных запросов (BETWEEN, >, <, >=, <=)
-
Поддерживает равенство (=) и сортировку (ORDER BY)
-
Автоматически сбалансированное дерево: глубина минимальна, операции поиска и вставки выполняются за O(log n)
Пример использования:
CREATE INDEX idx_name ON users(name);
🔹 2. Hash индекс
Индекс на основе хэш-функции, применяемой к значениям индексируемого поля.
Особенности:
-
Быстрый поиск по точному совпадению (WHERE key = value)
-
Не подходит для диапазонных запросов
-
В PostgreSQL используется только с =, не работает с ORDER BY, LIKE, BETWEEN
-
В MySQL (только движок MEMORY) ограниченное применение
Пример:
CREATE INDEX idx_email_hash ON users USING HASH (email);
🔹 3. GIN (Generalized Inverted Index)
Особенно эффективен для массивов, JSONB, полнотекстового поиска, tsvector.
Особенности:
-
Каждый элемент массива или документа индексируется отдельно
-
Подходит для @>, ?, @@, jsonb_contains, tsquery и т. д.
-
Используется в PostgreSQL
Пример:
CREATE INDEX idx_tags_gin ON articles USING GIN (tags);
🔹 4. GiST (Generalized Search Tree)
Подходит для индексации геометрических, текстовых и нестандартных типов данных (например, R-деревья, интервалы).
Особенности:
-
Позволяет реализовывать индексацию для пользовательских типов
-
Используется в PostgreSQL для географических расширений (PostGIS)
-
Менее эффективен по скорости, чем GIN, но более универсален
Пример:
CREATE INDEX idx_location ON places USING GIST (coordinates);
🔹 5. SP-GiST (Space-partitioned GiST)
Оптимизирован для непересекающихся пространственных данных, особенно полезен для работы с большими объемами геоданных.
Особенности:
- Эффективен для деревьев вроде k-d trees, **quad-trees
** - Используется для ускорения поиска в многомерных данных
🔹 6. BRIN (Block Range INdexes)
Индексы по диапазону блоков данных. Используются при хранении больших объемов данных, отсортированных по какому-то признаку (например, время или ID).
Особенности:
-
Хранит минимальное и максимальное значение в блоке
-
Очень компактен, но менее точен
-
Особенно полезен для временных и логов
Пример:
CREATE INDEX idx_logs_date ON logs USING BRIN (created_at);
🔹 7. Fulltext индекс
Используется для полнотекстового поиска по текстовым полям в MySQL и других СУБД.
Особенности:
-
Поддерживает поисковые операторы: MATCH ... AGAINST в MySQL
-
Работает с текстами, учитывает стоп-слова, морфологию, **релевантность
** - В PostgreSQL для этого используется tsvector + GIN
Пример (MySQL):
CREATE FULLTEXT INDEX idx_content ON articles(content);
🔹 8. Composite (многоколонковый) индекс
Индекс по нескольким колонкам одновременно. Полезен, когда запрос использует несколько полей в WHERE или ORDER BY.
Особенности:
-
Важен порядок колонок при создании
-
Используется, если запрос использует начальные колонки в фильтрах
-
Например, если индекс (A, B, C), то он используется при фильтрах по A, A+B, или A+B+C
Пример:
CREATE INDEX idx_user_name_email ON users(last_name, first_name, email);
🔹 9. Уникальные индексы (UNIQUE)
Обеспечивают уникальность значений в одном или нескольких полях.
Особенности:
-
Автоматически создаются при объявлении PRIMARY KEY или UNIQUE
-
Проверяют дублирование при вставке или обновлении
Пример:
CREATE UNIQUE INDEX idx_unique_email ON users(email);
🔹 10. Partial (фильтрованные) индексы
Индексируется только подмножество строк, соответствующее определенному условию.
Особенности:
-
Экономит пространство
-
Ускоряет запросы, затрагивающие только подмножество данных
Пример:
CREATE INDEX idx_active_users ON users(email) WHERE is_active = true;
🔹 11. Function-based индекс (вычисляемый)
Индекс на основе значения выражения или функции.
Особенности:
-
Поддерживается PostgreSQL и Oracle
-
Полезен для ускорения поиска по вычисляемым значениям
Пример:
CREATE INDEX idx_lower_name ON users (lower(name));
🔹 12. Clustered и Non-Clustered индексы (SQL Server, MySQL/InnoDB)
-
Clustered Index — определяет физический порядок строк в таблице (в InnoDB primary key всегда кластерный).
-
Non-Clustered Index — отдельная структура, содержащая ключ и ссылку на строку.
Особенности:
-
В таблице может быть только один кластерный индекс
-
Некластерных может быть много
Дополнительные понятия:
-
Covering Index — индекс, содержащий все поля, необходимые для запроса.
-
Invisible Index (MySQL 8+) — индекс, который временно исключён из плана выполнения запроса, но не удалён.
-
Expression Index — разновидность function-based индекса в некоторых СУБД.
Выбор типа индекса зависит от характера данных, запросов, объема таблицы, требований к скорости чтения/записи, наличия ограничений по уникальности и специфики СУБД.