mysql - 将具有索引的大表与小表连接起来

标签 mysql join

我在 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

解释结果:

Here is explain result

请指导我如何加快速度。

谢谢。

最佳答案

您应该向 events 表添加一个多列索引,涵盖字段 sourceid、eventtime(按此特定顺序)。

原因:MySQL 可以在查询中为每个表使用一个索引(嗯,索引合并是一个小异常(exception))。您在 sourceid、eventtime 字段上有单独的索引,MySQL 确实考虑使用这些索引,但忽略了它们(请参阅解释结果中可能的键和键字段) - 可能单独使用这两个索引都不够选择性。 p>

索引创建后通过另一个explain检查索引使用情况。您可能必须使用索引提示(使用索引强制索引)来使 MySQL 使用新索引,尽管分析表也可能有所帮助就这样。

关于mysql - 将具有索引的大表与小表连接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40343970/

相关文章:

r - 根据间隔范围内的公共(public) ID 和日期合并两个数据集

sql - 连接具有相同行数的两列

php - php 死掉后 Bootstrap 下拉列表停止工作

mysql - MySQL 函数出现 '' 附近的奇怪错误

mysql - 如何从表一中选择一列,同时传递表二中的列值?

MySql 左连接多表查询

java - 在 Android 中连接两个 MP3

mysql - 模式匹配如 Select Query

c# - 如何使 MySql 和 EF Core 将 tinyint 或 bit 映射到 bool 值?

mysql - 获取MySQL分层数据库中单项树