Структура таблицы:
CREATE TABLE `stat_old` (
`dt` datetime NOT NULL,
`offer_id` int(11) DEFAULT NULL,
`aff_id` int(11) DEFAULT NULL,
UNIQUE KEY `dt` (`dt`,`offer_id`,`aff_id`),
KEY `dt_2` (`dt`),
KEY `offer_id` (`offer_id`),
KEY `aff_id` (`aff_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
в поле dt
хранятся значения даты и времени, приведенные к часу, например, «2019-01-01 01:00:00», «2019-01-01 02:00:00 ', и он не уникален.
запрос:
explain select *
FROM stat_old
WHERE
dt between '2019-02-11 16:00:00' and '2019-02-18 15:59:59'
order by dt;
результат:
+----+-------------+----------+------+---------------+------+---------+------+----------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+------+---------------+------+---------+------+----------+-----------------------------+
| 1 | SIMPLE | stat_old | ALL | dt,dt_2 | NULL | NULL | NULL | 18914072 | Using where; Using filesort |
+----+-------------+----------+------+---------------+------+---------+------+----------+-----------------------------+
Как вы можете видеть, он почти сканирует полную таблицу, имеющую 20 044 835строк.На самом деле данные результата имеют только 2 108 707 строк.Почему индекс на dt
не используется?Как я могу это исправить?