У меня есть таблица с 200 миллионами строк, где индекс создается в столбце created_at, который является типом данных datetime.
show create table [tablename] output:
create table `table`
(`created_at` datetime NOT NULL)
PRIMARY KEY (`id`)
KEY `created_at_index` (`created_at`)
ENGINE=InnoDB AUTO_INCREMENT=208512112 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci'
created_at диапазоны от 2020-04-01 ~ 2020-05-28.
Я хочу получать только строки, которые выходят за рамки 2020-05-15 23:00: 00.
при запуске:
EXPLAIN SELECT created_at
FROM table
where created_at >= '2020-05-15 23:00:00';
он говорит, что выводит:
rows Extra
200mil Using Where
Я понимаю, что в RDMS, если строки индекса не упорядочены, но когда вы создаете индекс в столбце, он отсортирован, поэтому сразу после нахождения '2020-05-15 23:00:00' после этого он просто вернет все строки.
Кроме того, поскольку его мощность равна 7 мил, я подумал, что использование индекса будет лучше, чем полное сканирование таблицы .
Это потому, что я ввел дату в виде строки? но когда я пытаюсь
where created_at >= date('2020-05-15 23:00:00');
, все равно.
и
where created_at >= datetime('2020-05-15 23:00:00');
выводит синтаксическую ошибку.
Сделал mysql просто решил это было бы более эффективно выполнить полное сканирование таблицы?
EDIT:
с использованием equals
EXPLAIN SELECT created_at
FROM table
where created_at = '2020-05-15';
выходы:
key_len ref rows Extra
5 const 51
В предложении where если я меняю строку на дату ('2020-05-15'), она выводит:
key_len ref rows Extra
5 const 51 Using index condition
означает ли это, что первый равный запрос не использовал индекс?