лучший индекс при наличии двух столбцов отметки времени в mysql - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть две колонки в моей MySQL базе данных start_time и end_time. Они оба являются TIMESTAMP. Я создал индекс по двум столбцам.

У меня 3,5 миллиона строк. Для выполнения этого запроса требуется 13 секунд:

select * from test WHERE start_time > TIMESTAMP('2020-04-02 09:00:00') and end_time < TIMESTAMP('2020-04-02 10:00:00') 

Есть ли способ его оптимизации?

РЕДАКТИРОВАТЬ:

CREATE TABLE `test` (
 `YYY` varchar(255) NOT NULL,
 `start_time` timestamp NULL DEFAULT NULL,
 `end_time` timestamp NULL DEFAULT NULL,
 UNIQUE KEY `index1` (`YYY`,`start_time`) USING BTREE,
 UNIQUE KEY `index2` (`YYY`,`start_time`,`end_time`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Не беспокойтесь о том, чтобы один UNIQUE (index2) начинался с того же столбца, что и другой UNIQUE (index1).

Нет индекса (по крайней мере, в MySQL), который оптимизирует для такого теста "перекрытия".

Если интервалы времени не перекрываются (то есть, нет двух пар начала ... перекрытия концов, отличных от одной end, совпадает с другим `началом), тогда моя техника для IP-диапазонов достаточно хорошо масштабируется. Но это требует перестройки таблицы. http://mysql.rjweb.org/doc.php/ipranges

0 голосов
/ 14 апреля 2020

Не совсем ответ; слишком долго для комментария ...

Я не могу повторить этот вывод:

EXPLAIN
    -> SELECT *
    ->   FROM test
    ->  WHERE start_time >= '2020-04-02 09:00:00'
    ->    AND end_time <= '2020-04-02 10:00:00';
+----+-------------+-------+-------+---------------+--------+---------+------+--------+--------------------------+
| id | select_type | table | type  | possible_keys | key    | key_len | ref  | rows   | Extra                    |
+----+-------------+-------+-------+---------------+--------+---------+------+--------+--------------------------+
|  1 | SIMPLE      | test  | index | NULL          | index2 | 267     | NULL | 262035 | Using where; Using index |
+----+-------------+-------+-------+---------------+--------+---------+------+--------+--------------------------+
1 row in set (0.00 sec)

На самом деле, я удивлен, что индекс используется, учитывая, что YYY не является частью фильтрации состояние. В любом случае попробуйте без YYY или с YYY в качестве третьего аргумента в индексе. И удали другие индексы.

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