MYSQL/MariaDB схемы и выборки данных:Получить автомобили, которые прошли определенных камер
CREATE DATABASE IF NOT EXISTS `puzzle` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci;
USE `puzzle`;
DROP TABLE IF EXISTS `event`;
CREATE TABLE `event` (
`eventId` bigint(20) NOT NULL AUTO_INCREMENT,
`sourceId` bigint(20) NOT NULL COMMENT 'think of source as camera',
`carNumber` varchar(40) NOT NULL COMMENT 'ex: 5849',
`createdOn` datetime DEFAULT NULL,
PRIMARY KEY (`eventId`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
INSERT INTO `event` (`eventId`, `sourceId`, `carNumber`, `createdOn`) VALUES
(1, 44, '4456', '2016-09-20 20:24:05'),
(2, 26, '26484', '2016-09-20 20:24:05'),
(3, 5, '4456', '2016-09-20 20:24:06'),
(4, 3, '72704', '2016-09-20 20:24:15'),
(5, 3, '399606', '2016-09-20 20:26:15'),
(6, 5, '4456', '2016-09-20 20:27:25'),
(7, 44, '72704', '2016-09-20 20:29:25'),
(8, 3, '4456', '2016-09-20 20:30:55'),
(9, 44, '26484', '2016-09-20 20:34:55'),
(10, 26, '4456', '2016-09-20 20:35:15'),
(11, 3, '72704', '2016-09-20 20:35:15'),
(12, 3, '399606', '2016-09-20 20:44:35'),
(13, 26, '4456', '2016-09-20 20:49:45');
Я хочу, чтобы получить CarNumber (ы), которые имеют SourceId = 3 И (26 ИЛИ 44) во время 20:24 до 20:45. запрос должен быть быстрым, так как реальная таблица содержит более 300 миллионов записей.
до сих пор ниже максимального я мог бы пойти с запросом (его даже не производя действительных результатов)
select * from event e where
e.createdOn > '2016-09-20 20:24:00' and e.createdOn < '2016-09-20 20:45:00'
and e.sourceId IN(3,26,44) group by e.carNumber;
правильные результаты за предоставленные данные:
carNumber
4456
72704
Я действительно озадачен и застрял. я попробовал EXISTS, Joins, sub-query без везения, поэтому я задаюсь вопросом, способен ли SQL решить этот вопрос или мне нужно использовать кодирование с использованием бэкэнд?
версия MySQL/MariaDB в использовании:
MariaDB-5.5.50
MySQL-5.5.51
Я не могу использовать индексацию, так как Insertion получил более высокий приоритет в проекте, около 200 записей, вставленных в секунду, а реальная таблица содержит гораздо больше столбцов. btw, второй запрос работал быстрее ~ 20%, чем 1-й запрос, который идентичен –
@ juergend относительно третьего запроса, так как я не использую индексы, он занял более двух часов по сравнению со вторым запросом :( –
@JawadAlShaikh ... Третий запрос * специально * сформулированы для использования индексов, как описано в ответе. –