hostprofi.ru
Подобрать хостинг
Термин·буква И

Индекс БД

краткое определение

Индекс БД — вспомогательная структура данных в СУБД, ускоряющая поиск строк по определённым столбцам. Вместо полного перебора таблицы (Full Table Scan) база данных использует индекс и находит нужные строки за O(log n) или O(1) операций.

Индекс базы данных — объект, создаваемый в СУБД для ускорения выборки данных. Аналогия: предметный указатель в конце книги позволяет найти нужную страницу без чтения всей книги. Без индекса СУБД выполняет Full Table Scan (полный перебор всех строк), что для таблицы в 10 млн строк занимает секунды или минуты. С индексом — миллисекунды.

Как работает

Наиболее распространённый тип — B-tree (B-дерево). Индекс хранит отсортированные значения индексируемого столбца с указателями на строки в таблице. Поиск значения в B-tree — O(log n). Создание в MySQL/PostgreSQL:

CREATE INDEX idx_user_email ON users (email);
CREATE INDEX idx_orders_user_date ON orders (user_id, created_at);

Составной индекс (composite) — на несколько столбцов — используется для запросов, фильтрующих по всем или первым N столбцам в том же порядке. Индекс (user_id, created_at) ускоряет WHERE user_id=5 AND created_at>... но не WHERE created_at>... без user_id (правило «левого префикса»).

Типы индексов: B-tree (универсальный), Hash (только равенство, быстрее B-tree для точного поиска), GIN/GiST (полнотекстовый поиск, геоданные в PostgreSQL), FULLTEXT (MySQL, текстовый поиск).

Цена индекса

Индекс ускоряет SELECT, но замедляет INSERT, UPDATE, DELETE — при каждой записи индекс пересчитывается. Место на диске: индекс B-tree занимает 10–20% от объёма индексируемых данных. Чрезмерное индексирование таблицы с высокой интенсивностью записи снижает производительность.

История

B-дерево изобретено Рудольфом Байером и Эдвардом МакКрейтом в 1970 году. Первые СУБД с B-tree индексами — IBM DB2 и Oracle (конец 1970-х). В MySQL B-tree индексы реализованы в движке InnoDB с версии 3.23 (2001). PostgreSQL добавил GiST-индексы в версии 7.4 (2003), GIN — в версии 8.2 (2006).

Связь с хостингом

Медленные SQL-запросы — одна из самых частых причин низкой производительности сайтов на хостинге. Инструмент диагностики: EXPLAIN ANALYZE SELECT ... показывает план выполнения и выявляет Full Table Scan. В хостинге с WordPress индексы часто отсутствуют на кастомных полях (wp_postmeta), что приводит к медленной загрузке при большом количестве записей.

Типы индексов

B-Tree — универсальный, поддерживает диапазоны (>, <, BETWEEN, LIKE 'prefix%'). Hash — только точное равенство, быстрее B-Tree для поиска по равенству. GIN — для массивов, JSON, полнотекстовых данных в PostgreSQL. BRIN — для монотонных данных (timestamp) в больших таблицах. Spatial (R-Tree) — для геоданных.

Составные и покрывающие индексы

Составной индекс (a, b, c): эффективен для запросов по (a), (a, b), (a, b, c) — но не по (b) или (c) отдельно. Покрывающий индекс: включает все запрашиваемые поля — запрос выполняется без обращения к таблице (Index Only Scan). В PostgreSQL: CREATE INDEX ON tbl (col1) INCLUDE (col2, col3).

Обслуживание индексов

VACUUM ANALYZE в PostgreSQL обновляет статистику и убирает мёртвые строки. Bloat-индексов: при интенсивных UPDATE/DELETE индексы деградируют — REINDEX. В MySQL: OPTIMIZE TABLE перестраивает индексы InnoDB. Неиспользуемые индексы замедляют INSERT/UPDATE — удалять.

Когда индексы вредят

Каждый индекс замедляет INSERT/UPDATE/DELETE на таблице. Для таблицы с 1000 INSERT/с и 10 индексами — снижение производительности записи на 30–60%. OLTP-системы: минимум индексов (только необходимые). OLAP/DWH: больше индексов для аналитических запросов. Регулярно проверяйте pg_stat_user_indexes (PostgreSQL) на неиспользуемые индексы.

Другие термины