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

Какие знаешь принципы создания составного индекса?

2.0 Middle🔥 182 комментариев
#Базы данных#Производительность и оптимизация

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

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

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

Принципы создания составных индексов в базах данных

Составной индекс — это индекс, включающий несколько полей таблицы. Его создание требует понимания принципов работы индексов и оптимизации запросов.

Ключевые принципы

1. Порядок столбцов имеет решающее значение Поля в индексе должны располагаться в порядке от наиболее селективного к наименее селективному. Первый столбец определяет основную организацию данных.

-- Правильно: сначала country, затем city
CREATE INDEX idx_country_city ON users(country, city);

-- Запрос может использовать индекс полностью
SELECT * FROM users WHERE country = 'Russia' AND city = 'Moscow';

-- Или частично (только по country)
SELECT * FROM users WHERE country = 'Russia';

2. Принцип левой части (Leftmost Prefix) Составной индекс может использоваться для запросов, которые фильтруют по префиксу (левой части) индекса, но не для пропущенных столбцов.

-- Используется индекс idx_country_city (только часть country)
SELECT * FROM users WHERE country = 'Germany';

-- НЕ используется индекс (пропущен country)
SELECT * FROM users WHERE city = 'Berlin';

3. Селективность и кардинальность Более селективные столбцы (с большим количеством уникальных значений) должны идти первыми. Это уменьшает объем данных для последующей фильтрации.

-- Плохо: пол (2 значения) перед датой регистрации
CREATE INDEX idx_gender_regdate ON users(gender, registration_date);

-- Лучше: дата регистрации перед полом
CREATE INDEX idx_regdate_gender ON users(registration_date, gender);

4. Учет типа запросов и операторов Оптимальный составной индекс зависит от типов запросов:

  • Для равенства (=) — столбцы можно располагать в любом порядке
  • Для диапазонов (>, <, BETWEEN) — эти столбцы лучше ставить в конце
  • Для сортировки (ORDER BY) — порядок в индексе должен соответствовать порядку в ORDER BY
-- Оптимальный индекс для диапазона и сортировки
SELECT * FROM orders 
WHERE customer_id = 12345 
AND order_date >= '2024-01-01'
ORDER BY order_date DESC, amount;

-- Индекс: customer_id, order_date, amount
CREATE INDEX idx_customer_date_amount ON orders(customer_id, order_date, amount);

5. Покрывающие индексы (Covering Index) Индекс включает все поля, необходимые для запроса, что позволяет избежать обращения к таблице.

-- Если нужны только customer_id и status
SELECT customer_id, status FROM orders WHERE date = '2024-06-15';

-- Покрывающий индекс
CREATE INDEX idx_date_customer_status ON orders(date, customer_id, status);

6. Баланс между чтением и записью Каждый дополнительный индекс замедляет операции INSERT, UPDATE, DELETE. Нужно находить компромисс между производительностью запросов и скоростью модификации данных.

Практические рекомендации

Анализируйте реальные запросы:

  • Используйте EXPLAIN для понимания использования индексов
  • Мониторьте slow-запросы
  • Учитывайте частоту выполнения запросов

Избегайте избыточных индексов:

-- idx_a_b избыточен при наличии idx_a_b_c
CREATE INDEX idx_a_b_c ON table(a, b, c);
CREATE INDEX idx_a_b ON table(a, b); -- Избыточный!

Учитывайте ограничения:

  • Максимальное количество столбцов и длину индекса (зависит от СУБД)
  • Размер индекса в памяти
  • Особенности движка хранения (InnoDB, MyISAM и др.)

Правильно спроектированные составные индексы могут ускорить выполнение запросов в десятки раз, но требуют глубокого анализа паттернов доступа к данным. Всегда тестируйте производительность на реалистичных объемах данных перед внедрением в production.