Многие разработчики сталкиваются с медленным SELECT, когда запросы фильтруют таблицу по дате и статусу. Добавить составной индекс MariaDB по дате и статусу – один из самых эффективных способов ускорить такие запросы. В этой статье мы разберём, почему обычный индекс не всегда помогает, и как правильно создать совместный индекс, чтобы он работал в обеих колонках одновременно.

Разбор задачи

Предположим, у нас есть таблица orders с полями order_date и status. Запросы вида SELECT * FROM orders WHERE order_date BETWEEN ‘2023-01-01’ AND ‘2023-01-31′ AND status=’completed’ выполняются медленно, даже при наличии отдельного индекса на order_date. Это происходит, потому что MariaDB вынуждена сначала отфильтровать по дате, а затем просканировать результаты, чтобы применить второй критерий. Совместный индекс объединяет оба условия в один быстрый путь поиска.

Пошаговое решение

Рабочий код

/* Добавляем составной индекс по полям date_col и status_col */
ALTER TABLE orders ADD INDEX idx_date_status (date_col, status_col);

/* Пример запроса, использующего индекс */
SELECT * FROM orders
WHERE date_col BETWEEN '2024-01-01' AND '2024-01-31'
  AND status_col = 'completed'
ORDER BY date_col DESC
LIMIT 100;

/* Комментарии
   1. Индекс создаёт структуру B-Tree, оптимизируя поиск по диапазону дат и конкретному статусу.
   2. Важно, чтобы типы столбцов совпадали с условиями запроса (DATE, VARCHAR, ENUM и т.п.).
   3. Если статус часто изменяется, индекс может тормозить вставки/обновления – оцените нагрузку.*/

Типичные ошибки

  • Неправильный порядок полей в индексе – поиск по статусу без даты не использует индекс.
  • Индексация большого количества уникальных значений (например, id) внутри составного индекса снижает эффективность.
  • Не обновлённый статистический анализ приводит к неэффективному плану выполнения.

FAQ

Как проверить, использует ли запрос индекс?

Выполните EXPLAIN SELECT …; Если в столбце key виден idx_date_status, запрос использует индекс.

Нужен ли отдельный индекс для каждого поля?

Если запросы часто фильтруют только по статусу, добавить отдельный индекс (status_col). Для диапазона дат без статуса – отдельный индекс по date_col.

Что делать, если вставки тормозят из‑за индекса?

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

Заключение

Успешный быстрый поиск в MariaDB достигается правильной структурой составного индекса. Следуйте чек‑листу:

  1. Определите частые фильтры (дата + статус).
  2. Создайте индекс idx_date_status.
  3. Проверьте план выполнения с EXPLAIN.
  4. Обновите статистику ANALYZE TABLE.
  5. Мониторьте влияние на вставки/обновления.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *