4
此查詢的執行時間超過2秒(對於10k行)。有沒有可能優化這個查詢?MySQL中BETWEEN的執行時間很長
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,timestamp_a,timestamp_b,差異):
1 1349878538 1349878539 1
2 1349878679 1349878539 2
3 1349878724 1349878539 1
5 1349878836 1349878539 1
6 1349878890 1349878641 1
表一個
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'中的記錄a在'b'表中的時間戳之間。
編輯:simples解決方案(運行速度非常快):
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條件非常複雜,但如果沒有這些信息,很難推薦替代方案。 –
thx爲你的答案 - 請現在看到我的問題 – ekstro
它不會幫助這個查詢顯着,但你應該使時間戳列'TIMESTAMP's或'INT UNSIGNED NOT NULL'; 'BIGINT'只是錯誤的類型。 ID列也應該是'UNSIGNED'。 –