Ответ
Индекс — это дополнительная структура данных (чаще всего B-дерево), которая ускоряет операции поиска (SELECT), фильтрации (WHERE) и сортировки (ORDER BY), но замедляет вставку (INSERT), обновление (UPDATE) и удаление (DELETE) из-за необходимости поддерживать саму индексную структуру.
Аналогия: Индекс в БД — как алфавитный указатель в книге. Без него нужно просматривать все страницы (полный сканирование таблицы, FULL TABLE SCAN).
Основные типы индексов:
- B-tree (B+tree): Стандартный, сбалансированный. Подходит для диапазонных запросов (
WHERE age BETWEEN 20 AND 30) и сортировки. - Hash: Только для поиска по точному совпадению (
WHERE id = 123). Быстрее B-tree для=, но не поддерживает диапазоны. - Составной (Composite): По нескольким столбцам. Порядок важен: индекс
(last_name, first_name)поможет дляWHERE last_name='Ivanov', но не дляWHERE first_name='Petr'.
Пример создания и анализа:
-- Создание индекса
CREATE INDEX idx_users_email ON users(email);
-- Составной индекс
CREATE INDEX idx_users_name_age ON users(last_name, age);
-- Анализ использования индекса с EXPLAIN
EXPLAIN ANALYZE
SELECT * FROM users WHERE last_name = 'Ivanov' AND age > 25;
-- В выводе ищем 'Index Scan' или 'Bitmap Index Scan' — это признаки использования индекса.
Best Practices:
- Индексируйте столбцы, часто используемые в
WHERE,JOIN,ORDER BY. - Избегайте индексов по часто изменяемым столбцам.
- Слишком много индексов вредит производительности записи и увеличивает размер БД.
- Используйте
EXPLAINдля проверки плана запроса и выявления отсутствующих индексов.