这个查询的执行时间超过了2秒(10,000行数据)。是否有可能对这个查询进行优化?
SELECT id, MIN(ABS(timestamp_a - timestamp_b))
FROM a
INNER JOIN b ON ( timestamp_a between (timestamp_b - 5 * 60)
AND (timestmap_b + 5 * 60) )
GROUP BY id
样例结果 (id, 时间戳A, 时间戳B, 差值):
1 1349878538 1349878539 1
2 1349878679 1349878539 2
3 1349878724 1349878539 1
5 1349878836 1349878539 1
6 1349878890 1349878641 1
表格a
CREATE TABLE `a` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`timestamp_a` bigint(20) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
INDEX `a` (`timestamp_a`) USING BTREE
)
表格 b
CREATE TABLE `b` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`timestamp_b` bigint(20) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
INDEX `b` (`timestamp_b`) USING BTREE
)
这两个表之间没有关联 - 我要从表'a'中搜索那些时间戳在表'b'时间戳范围内的记录。
编辑:简单解决方案(运行非常快):
SELECT id, MIN(ABS(timestamp_a - timestamp_b))
FROM (SELECT id, timestamp, (timestamp - 5 * 60) timestamp_a, (timestamp + 5 * 60) timestamp_b) a
INNER JOIN b ON ( timestamp between timestamp_a AND timestamp_b )
GROUP BY id
SHOW CREATE TABLE
输出。这些表如何相互关联?我认为主要问题在于你非常复杂的JOIN条件,但是如果没有这些信息,很难推荐替代方案。 - Mike BrantTIMESTAMP
或INT UNSIGNED NOT NULL
,BIGINT
只是错误的类型。ID列也应该是UNSIGNED
。 - G-Nuggettimestamp_b_minus
和timestamp_b_plus
...这两列将包含您正在执行的联接计算的结果。 然后,您可以对这两个列创建索引,这将防止您现在可能看到的表扫描。 - Michael Fredrickson