Многие разработчики сталкиваются с медленным 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 достигается правильной структурой составного индекса. Следуйте чек‑листу:
- Определите частые фильтры (дата + статус).
- Создайте индекс idx_date_status.
- Проверьте план выполнения с EXPLAIN.
- Обновите статистику ANALYZE TABLE.
- Мониторьте влияние на вставки/обновления.
