Я использую MySQL 5.7.10.
Я проверяю новый запрос для отчета об аудите.
Я выполню его в простом фоне Unix процесс, который вызывает mysql из консоли.
Для проверки запроса я использую рабочую таблицу в Heidi SQL.
Таблица:
CREATE TABLE `services` (
`assigned_id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`service_id` VARCHAR(10) NOT NULL,
`name` VARCHAR(50) NOT NULL,
...
`audit_insert` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
...
INDEX `idx_audit_insert` (`audit_insert`),
...
);
Простая рабочая таблица:
SET @numberOfMonths:=6;
SET @today:=CURRENT_TIMESTAMP();
SET @todaySubstractnumberOfMonths=TIMESTAMP( date_sub(@today, interval @numberOfMonths MONTH) );
EXPLAIN SELECT service_id from services where audit_insert between @todaySubstractnumberOfMonths and @today;
Вывод объяснения для этого запроса: id, select_type, таблица, разделы, тип, возможные_ключи, ключ, key_len, ref, строки , отфильтрованный, Extra 1, SIMPLE, сервисы, [все разделы], ALL, idx_audit_insert ,,,, 47319735,21.05, Использование где
So, index ' idx_audit_insert 'не используется.
Если я изменю запрос на:
EXPLAIN SELECT service_id where audit_insert between '2020-01-01 00:00:00' and '2020-03-10 23:59:59';
Вывод: id, select_type, таблица, разделы, тип, возможные_ключи, ключ, key_len, ref, строки, отфильтрованные, Extra 1, SIMPLE, tdom_transitos, [все разделы], диапазон, idx_audit_insert, idx_audit_insert , 4, 4257192,100.00, с использованием условия индекса
Теперь индекс используется и Значение строк значительно уменьшено.
Итак, мои вопросы:
- Как заставить переменные быть метками времени? Что-то не так в моем рабочем листе?
или, может быть,
- Как я могу использовать индекс (пытаясь избежать таких подсказок, как USE INDEX, FORCE INDEX ...)?
Большое спасибо.
(РЕДАКТИРОВАТЬ: я копирую тот же вопрос в dbastackexchange. Может быть, более уместно для этого форума).