MySQL: использовать индекс в фоновом запросе - PullRequest
0 голосов
/ 10 марта 2020

Я использую 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. Может быть, более уместно для этого форума).

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Все эти арифметические даты c можно сделать в SQL. Если вы сделаете это, он будет использовать индекс.

Выражения «константы» (например, CURDATE() + INTERVAL 4 MONTH) перед началом запроса будут оцениваться в типе данных DATETIME или TIMESTAMP.

0 голосов
/ 12 марта 2020

Ну, может быть, это не тот ответ, который я думал найти, но он отлично работает.

Я разделил поле audit_insert на другое, audit_insert_datetype , типа DATE. У этого поля также есть новый индекс.

Я изменил запрос для выполнения с этим полем, и я попытался заставить переменные @ ... иметь тип даты (с current_date и date).

Результаты: новый индекс используется и время выполнения значительно сокращается. Может быть, это плохой стиль, но он работает так, как мне нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...