Почему индекс не работает для неуникального столбца datetime? - PullRequest
0 голосов
/ 21 февраля 2019

Структура таблицы:

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 не используется?Как я могу это исправить?

1 Ответ

0 голосов
/ 21 февраля 2019

Создание dt первой части первичного ключа поможет при получении большего диапазона дат в dt порядке:

alter table stat_old
drop key dt,
drop key dt_2,
add primary key (`dt`,`offer_id`,`aff_id`)
...