Индексы в базах данных. Виды индексов.

Базы данных
Oleksandr Vykhor
11-03-2025 14:48:24


Индексы в базах данных используются для ускорения поиска и извлечения данных. Они работают аналогично указателям в книге, позволяя быстро находить нужные записи без необходимости просматривать всю таблицу. Основные цели использования индексов:

1. Ускорение поиска. Индексы позволяют быстро находить строки, соответствующие определённым условиям в запросе (например, `WHERE`).

2. Оптимизация сортировки и группировки. Если запрос включает операции `ORDER BY` или `GROUP BY`, индексы помогают ускорить выполнение этих операций.

3. Ускорение соединений (JOIN). При объединении таблиц индексы помогают быстрее находить соответствующие строки в связанных таблицах.

4. Обеспечение уникальности. Уникальные индексы гарантируют, что в столбце или группе столбцов не будет дубликатов.

5. Улучшение производительности. Индексы уменьшают количество операций ввода-вывода (I/O), что особенно важно для больших таблиц.

Однако индексы также имеют свои недостатки:

  • Затраты на хранение. Индексы занимают дополнительное место на диске.
  • Затраты на обновление. При вставке, обновлении или удалении данных индексы должны обновляться, что может замедлить эти операции.

Поэтому индексы следует создавать с учётом конкретных запросов и нагрузки на базу данных, чтобы достичь оптимального баланса между производительностью и затратами на поддержание индексов.

Виды индексов.

В базах данных существует несколько видов индексов, каждый из которых предназначен для определённых сценариев использования. Основные виды индексов:

1. Одностононние индексы (Single-column indexes)

  • Создаются на одном столбце таблицы.
  • Подходят для ускорения поиска по одному столбцу.

Пример: `CREATE INDEX idx_name ON users (name);`

2. Составные индексы (Composite indexes)

  • Создаются на нескольких столбцах.
  • Полезны для запросов, которые фильтруют или сортируют по нескольким столбцам.
  • Порядок столбцов в индексе важен: запросы должны использовать префикс индекса (например, если индекс на `(col1, col2)`, то запросы с фильтрацией только по `col1` будут использовать индекс, а только по `col2` — нет).

Пример: `CREATE INDEX idx_name_age ON users (name, age);`

3. Уникальные индексы (Unique indexes)

  • Гарантируют, что все значения в индексируемом столбце (или группе столбцов) уникальны.
  • Используются для обеспечения целостности данных.

Пример: `CREATE UNIQUE INDEX idx_email ON users (email);`

4. Полнотекстовые индексы (Full-text indexes)

  • Предназначены для поиска по текстовым данным (например, по ключевым словам или фразам).
  • Поддерживают сложные поисковые запросы, такие как поиск по синонимам или морфологии.

Пример: `CREATE FULLTEXT INDEX idx_content ON articles (content);`

5. Пространственные индексы (Spatial indexes)

  • Используются для работы с геопространственными данными (например, координаты, геометрия).
  • Оптимизируют поиск по географическим объектам.

Пример: `CREATE SPATIAL INDEX idx_location ON places (coordinates);`

6. Хэш-индексы (Hash indexes)

  • Используют хэш-функции для быстрого поиска по точным совпадениям.
  • Эффективны для операций `=`, но не подходят для диапазонных запросов (например, `BETWEEN`, `>`).

Пример: `CREATE INDEX idx_hash ON users USING HASH (email);`

7. B-деревья (B-tree indexes)

  • Наиболее распространённый тип индексов.
  • Поддерживают диапазонные запросы (например, `>`, `<`, `BETWEEN`), а также точные совпадения.

Пример: `CREATE INDEX idx_btree ON users (age);`

8. Bitmap-индексы (Bitmap indexes)

  • Используются для столбцов с небольшим количеством уникальных значений (например, пол, статус).
  • Эффективны для операций `AND`, `OR` и `NOT`.

Пример: `CREATE BITMAP INDEX idx_status ON orders (status);`

9. Кластерные индексы (Clustered indexes)

  • Определяют физический порядок данных в таблице.
  • В одной таблице может быть только один кластерный индекс.

Пример: В MySQL первичный ключ (`PRIMARY KEY`) автоматически создаёт кластерный индекс.

10. Некластерные индексы (Non-clustered indexes)

  • Создают отдельную структуру данных, которая ссылается на строки в таблице.
  • В одной таблице может быть несколько некластерных индексов.

Пример:`CREATE INDEX idx_nonclustered ON users (name);`

11. Частичные индексы (Partial indexes)

  • Индексируют только часть данных, удовлетворяющих определённому условию.
  • Полезны для больших таблиц, где индексирование всех строк неэффективно.

Пример: `CREATE INDEX idx_active_users ON users (name) WHERE status = 'active';`

12. Функциональные индексы (Function-based indexes)

  • Индексируют результат выполнения функции над столбцом.
  • Полезны для запросов, где данные фильтруются или сортируются по результату функции.

Пример: `CREATE INDEX idx_lower_name ON users (LOWER(name));`

13. Покрывающие индексы (Covering indexes)

  • Содержат все данные, необходимые для выполнения запроса, что позволяет избежать обращения к самой таблице.

Пример: `CREATE INDEX idx_covering ON users (id, name, age);` (если запрос выбирает только эти столбцы).

14. Индексы по выражениям (Expression indexes)

  • Аналогичны функциональным индексам, но могут включать более сложные выражения.

Пример: `CREATE INDEX idx_expr ON orders (total_price * quantity);`

15. Индексы для массивов (GIN, GiST, BRIN)

  • Используются в PostgreSQL для работы с массивами, JSON, полнотекстовым поиском и другими сложными типами данных.

Пример: `CREATE INDEX idx_gin ON documents USING GIN (tags);`

Выбор типа индекса зависит от структуры данных, типов запросов и требований к производительности. Неправильное использование индексов может привести к ухудшению производительности, поэтому важно анализировать запросы и тестировать их влияние на базу данных.


Назад