CREATE TABLE `event` (
`eventId` bigint unsigned NOT NULL AUTO_INCREMENT,
`urlId` int DEFAULT NULL,
###... несколько незначимых в данном случае столбцов опущены
`clientTime` bigint unsigned NOT NULL,
PRIMARY KEY (`eventId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
SELECT * FROM `event` WHERE `urlId`=432 ORDER BY `clientTime` ASC;
EXPLAIN SELECT * FROM `event` WHERE `urlId`=432 ORDER BY `clientTime` ASC;
+---+---+---+---+---+---+---+---+---+---+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+---+---+---+---+---+---+---+---+---+---+
| 1 | SIMPLE | event | ALL | urlId_sort,select_no_time | NULL | NULL | NULL | 5263392 | Using where; Using filesort |
+---+---+---+---+---+---+---+---+---+---+
композитный индекс пробовал первым, не работает.
Стоит пробовать partitioned?
PARTITION BY HASH(urlId)
PARTITIONS ...;
show indexes from `event`;
event 0 PRIMARY 1 eventId A
event 1 clientTime_sort 1 clientTime A
event 1 typeId_sort 1 typeId A
event 1 urlId_sort 1 urlId A
event 1 select_no_time 1 urlId A
event 1 select_no_time 2 clientTime A
А force index пробовали? Если да - то быстрее работает или нет?
CREATE TABLE `event` (
`eventId` int(10) unsigned NOT NULL AUTO_INCREMENT,
`urlId` int(11) DEFAULT NULL,
`typeId` int(11) NOT NULL,
`payload` varchar(191) NOT NULL DEFAULT '',
`userAgent` varchar(191) NOT NULL DEFAULT '',
`userIp` varchar(16) NOT NULL,
`platform` varchar(30) NOT NULL DEFAULT '',
`browser` varchar(30) NOT NULL DEFAULT '',
`browserVersion` varchar(30) NOT NULL DEFAULT '',
`country` varchar(191) NOT NULL DEFAULT '',
`region` varchar(191) NOT NULL DEFAULT '',
`city` varchar(191) NOT NULL DEFAULT '',
`age` tinyint(3) NOT NULL DEFAULT 0,
`isMobile` tinyint(1) NOT NULL DEFAULT 0,
`userName` varchar(191) NOT NULL DEFAULT '',
`userId` varchar(64) NOT NULL,
`clientTime` bigint(20) unsigned NOT NULL,
`time` int(11) NOT NULL,
PRIMARY KEY (`eventId`),
KEY `clientTime_sort` (`clientTime`),
KEY `typeId_sort` (`typeId`),
KEY `urlId_sort` (`urlId`),
KEY `select_no_time` (`urlId`,`clientTime`) USING HASH,
CONSTRAINT `event_ibfk_2` FOREIGN KEY (`typeId`) REFERENCES `type` (`typeId`) ON DELETE CASCADE,
CONSTRAINT `fk_url_id` FOREIGN KEY (`urlId`) REFERENCES `url` (`urlId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `type` (
`typeId` int(11) NOT NULL AUTO_INCREMENT,
`label` varchar(30) NOT NULL,
`title` varchar(191) NOT NULL,
`table` varchar(30) NOT NULL,
PRIMARY KEY (`typeId`),
UNIQUE KEY `label` (`label`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `url` (
`urlId` int(11) NOT NULL AUTO_INCREMENT,
`siteId` int(11) NOT NULL,
`url` varchar(225) CHARACTER SET utf8mb3 COLLATE utf8mb3_unicode_ci NOT NULL,
PRIMARY KEY (`urlId`),
UNIQUE KEY `siteId` (`siteId`,`url`),
CONSTRAINT `url_ibfk_1` FOREIGN KEY (`siteId`) REFERENCES `site` (`siteId`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `site` (
`siteId` int(11) NOT NULL AUTO_INCREMENT,
`url` varchar(191) NOT NULL,
PRIMARY KEY (`siteId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Вообще как-то дико странно. Ибо 6 миллионов записей - это ни о чем. И если я загоняю в тестовую таблицу данные и гоняю - оно как то довольно быстро
select urlId, count(*) from event group by urlId;
urlId=432 выходит в районе 22%.
Вот explain запроса с кол-вом результатов примерно 1%: