← Назад к вопросам

Что такое индексация в базе данных?

2.0 Middle🔥 211 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое индексация в базе данных?

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

Как работают индексы?

Индексы хранят отсортированные значения колонки с указателями на полные записи таблицы. Наиболее распространённая структура — B-tree (сбалансированное дерево поиска):

Индекс по полю "email":

       [M]
      /   \
    [D]    [S]
   / | \  / | \
[A][B][E][P][R][Z]
  |  |  |  |  |  |
  Row1 Row3 Row5 Row7 Row8

B-tree гарантирует O(log N) время поиска вместо O(N) при полном сканировании таблицы.

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

PRIMARY KEY

  • Уникален, не может быть NULL
  • Автоматически индексируется
CREATE TABLE users (
    id INT PRIMARY KEY,  -- индекс создан автоматически
    email VARCHAR(255)
);

UNIQUE INDEX

  • Гарантирует уникальность значений
  • Ускоряет поиск
CREATE UNIQUE INDEX idx_email ON users(email);

COMPOSITE INDEX (составной индекс)

  • По нескольким колонкам
  • Важен порядок колонок
CREATE INDEX idx_user_date ON orders(user_id, order_date);
-- Ускоряет: SELECT * FROM orders WHERE user_id = 5 AND order_date > '2024-01-01'
-- НО НЕ ускоряет: SELECT * FROM orders WHERE order_date > '2024-01-01'

FULL-TEXT INDEX

  • Для текстового поиска
CREATE FULLTEXT INDEX idx_title ON articles(title, content);
SELECT * FROM articles WHERE MATCH(title, content) AGAINST('database');

SPATIAL INDEX

  • Для географических данных

Плюсы и минусы

Преимущества:

  • Существенное ускорение SELECT запросов
  • Ускорение JOIN, GROUP BY, ORDER BY
  • Обеспечение уникальности данных

Недостатки:

  • Замедление INSERT, UPDATE, DELETE (нужно обновить индексы)
  • Потребление дополнительной памяти
  • Требует обслуживания (дефрагментация, ANALYZE)

Когда создавать индексы?

Создавайте индексы на:

  • Колонки в WHERE clausе
  • Колонки в JOIN условиях
  • Колонки в ORDER BY
  • Колонки часто используемых SELECT запросов

НЕ создавайте индексы на:

  • Колонки с низкой кардинальностью (много повторений)
  • Булевы колонки
  • Часто NULL значения
  • Малые таблицы

EXPLAIN для анализа

EXPLAIN SELECT * FROM users WHERE email = 'john@example.com';
-- type: range (использует индекс)
-- rows: 1 (вернёт 1 строку)

EXPLAIN SELECT * FROM users WHERE age > 25;
-- type: ALL (полное сканирование)
-- rows: 10000 (сканирует всю таблицу)

Пример оптимизации

Таблица users (100 тыс. записей):

-- Медленно (1.5 сек)
SELECT * FROM users WHERE email = 'test@example.com';

-- Добавляем индекс
CREATE INDEX idx_email ON users(email);

-- Быстро (0.001 сек)
SELECT * FROM users WHERE email = 'test@example.com';

Для C++ разработчика

При работе с БД:

  • Всегда профилируйте запросы (EXPLAIN, ANALYZE)
  • Избегайте N+1 queries через JOIN и индексы
  • Используйте подготовленные statements
  • Регулярно проверяйте статистику индексов

Индексация — критический инструмент для масштабируемости приложения. Правильная индексация может улучшить производительность на порядки.

Что такое индексация в базе данных? | PrepBro