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

Как работает индекс в SQL?

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

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

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

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

# Индексы в 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 (требуют обновления индекса)
  • Неправильно созданные индексы замедляют запросы
Как работает индекс в SQL? | PrepBro