Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Индексы в SQL
Индекс в SQL — это структура данных, которая ускоряет поиск, сортировку и фильтрацию данных в таблице. Без индексов БД выполняет полное сканирование таблицы (Full Table Scan), проверяя каждую строку.
Как работает индекс
Индекс использует специальную структуру данных (обычно B-дерево) для хранения отсортированных значений столбца с указателями на соответствующие строки таблицы.
Таблица Users без индекса:
┌─────┬──────┬────────┐
│ id │ name │ email │
├─────┼──────┼────────┤
│ 1 │ John │ john@ │
│ 2 │ Jane │ jane@ │
│ 3 │ Bob │ bob@ │
│ ... │ ... │ ... │
└─────┴──────┴────────┘
Индекс по столбцу email:
┌──────────┬──────┐
│ email │ row │
├──────────┼──────┤
│ bob@... │ 3 │
│ jane@... │ 2 │
│ john@... │ 1 │
└──────────┴──────┘
(отсортирован и быстро ищется через бинарный поиск)
Типы индексов
1. Primary Key (Первичный ключ)
Автоматически создаёт индекс на первичный ключ. Гарантирует уникальность.
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100)
);
2. Unique Index (Уникальный индекс)
Обеспечивает уникальность значений в столбце.
CREATE UNIQUE INDEX idx_email ON users(email);
3. Простой индекс (Regular Index)
Ускоряет поиск, но не гарантирует уникальность.
CREATE INDEX idx_lastname ON users(last_name);
4. Составной индекс (Composite Index)
Индекс по нескольким столбцам. Порядок столбцов важен!
CREATE INDEX idx_lastname_firstname ON users(last_name, first_name);
-- Этот индекс помогает запросам:
SELECT * FROM users WHERE last_name = Smith AND first_name = John;
SELECT * FROM users WHERE last_name = Smith;
-- Но НЕ помогает этому запросу:
SELECT * FROM users WHERE first_name = John; -- Нужен индекс на first_name
5. Full-Text Index
Для полнотекстового поиска.
CREATE FULLTEXT INDEX idx_content ON articles(content);
SELECT * FROM articles WHERE MATCH(content) AGAINST(java IN BOOLEAN MODE);
Влияние на производительность
-- БЕЗ индекса (Full Table Scan)
SELECT * FROM orders WHERE customer_id = 42;
-- Время: ~1000 мс при 1 млн строк (проверяет все строки)
-- С индексом на customer_id
CREATE INDEX idx_customer ON orders(customer_id);
SELECT * FROM orders WHERE customer_id = 42;
-- Время: ~5 мс (бинарный поиск в B-дереве)
Когда использовать индексы
Хорошо для индексов:
- Столбцы в WHERE, JOIN, ORDER BY, GROUP BY
- Столбцы с низкой кардинальностью (немного уникальных значений)
- Часто ищемые данные
Плохо для индексов:
- Столбцы с высокой кардинальностью (булевы, пол)
- Часто обновляемые данные (замедляет INSERT/UPDATE)
- Маленькие таблицы
Проверка использования индекса
-- В MySQL
EXPLAIN SELECT * FROM users WHERE email = john@example.com;
-- Ищем possible_keys и используемый key
Недостатки индексов
- Требуют дополнительную память
- Замедляют INSERT, UPDATE, DELETE (требуют обновления индекса)
- Неправильно созданные индексы замедляют запросы