我在 MySql 数据库中有一个名为 event 的大型表,有 1000 万条记录。
事件
CREATE TABLE `event` (
`eventId` BIGINT(20) NOT NULL AUTO_INCREMENT,
`eventTime` BIGINT(20) NOT NULL COMMENT 'ex: 1431201865000 (epoch is milliseconds)',
`sourceId` BIGINT(20) NOT NULL COMMENT 'ex: pole-code: 1 = JA005, patrolCarCode: 5000 = D4588',
PRIMARY KEY (`eventId`),
INDEX `eventTime` (`eventTime`),
INDEX `sourceId` (`sourceId`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=12343262;
我有一个小表,大约有 70 条记录。
来源
CREATE TABLE `source` (
`sourceId` BIGINT(20) NOT NULL AUTO_INCREMENT,
`sourceName` VARCHAR(100) NOT NULL COMMENT 'ex: pole-code: JA005, patrolCarCode:D4588' COLLATE 'utf8_unicode_ci',
`sourceGps` VARCHAR(40) NULL DEFAULT NULL COMMENT 'Only for Fixed source (Poles) ex: 25.110227 N 55.239798 E, 24.993183 N 55.250382 E, 0.000000 N 0.000000 E' COLLATE 'utf8_unicode_ci',
`sourceAddress` VARCHAR(255) NULL DEFAULT NULL COMMENT 'Only for Fixed source (Poles) ex: Dubai, Bur Dubai, Burjman Center Interchange' COLLATE 'utf8_unicode_ci',
`sourceAltAddress` VARCHAR(255) NULL DEFAULT NULL COMMENT 'Alternative address, ex: address in arabic' COLLATE 'utf8_unicode_ci',
PRIMARY KEY (`sourceId`),
INDEX `sourceName` (`sourceName`)
)
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
AUTO_INCREMENT=71
;
数据
INSERT INTO `event` (`eventId`, `eventTime`, `sourceId`) VALUES
( 1474261476616, 33, 1),
( 1474261438966, 26, 2),
( 1474261479346, 25, 3),
( 1474261429952, 8, 5),
( 1474261477316, 33, 6)
INSERT INTO `source` (`sourceId`, `sourceName`, `sourceGps`, `sourceAddress`) VALUES
( 1, 'JA001', '25.110227 N 55.239798 E', 'Interchange'),
( 2, 'JA002', '25.110227 N 55.239798 E', 'Interchange'),
( 3, 'JA003', '25.110227 N 55.239798 E', 'Interchange'),
( 4, 'JA004', '25.110227 N 55.239798 E', 'Interchange'),
( 5, 'JA005', '25.110227 N 55.239798 E', 'Interchange')
任务
我想获取在特定时间“1474261429952”之后发生的所有事件。
经过搜索,到目前为止我已经制定了以下查询,这带来了结果,但速度很慢。 从表中检索结果大约需要 1.5 分钟。
SELECT count(source.sourceId) as 'totalEvents', source.sourceId, source.sourceGps,
source.sourceAddress from event inner join source on event.sourceId = source.sourceId
where eventTime >= 1474261429952 group by source.sourceId
解释结果:
请指导我如何加快速度。
谢谢。
最佳答案
您应该向 events
表添加一个多列索引,涵盖字段 sourceid、eventtime
(按此特定顺序)。
原因:MySQL 可以在查询中为每个表使用一个索引(嗯,索引合并是一个小异常(exception))。您在 sourceid、eventtime
字段上有单独的索引,MySQL 确实考虑使用这些索引,但忽略了它们(请参阅解释结果中可能的键和键字段) - 可能单独使用这两个索引都不够选择性。 p>
索引创建后通过另一个explain
检查索引使用情况。您可能必须使用索引提示(使用索引
或强制索引
)来使 MySQL 使用新索引,尽管分析表
也可能有所帮助就这样。
关于mysql - 将具有索引的大表与小表连接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40343970/