问题:查询速度慢。
table1
有大约5 000行table2
有大约50 000行int(11)
PostgreSQL - 0,04秒(带索引)
SELECT *
FROM table1
LEFT JOIN table2
ON table2_timestamp BETWEEN table1_timestamp - 500
AND table1_timestamp + 500 ;
有人可以帮我优化MySQL的查询吗?
说明:
1 SIMPLE a index a 9 2 Using index
1 SIMPLE b index b b 9 5 Using index
表:
CREATE TABLE `a` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`table1_timestamp` bigint(20) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
INDEX `a` (`table1_timestamp`) USING BTREE
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=3
ROW_FORMAT=COMPACT
;
CREATE TABLE `b` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`table2_timestamp` bigint(20) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
INDEX `a` (`table2_timestamp`) USING BTREE
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=3
ROW_FORMAT=COMPACT
;
答案 0 :(得分:1)
有几点让人想起,但两者都感觉像是长镜头。实际上,假设您的示例是准确的表示,您看起来应该对查询做的事情不多。
1:您正在使用BIGINT,其最大值为9x10 ^ 18(SIGNED)。 INT的最大值为4x10 ^ 9(UNSIGNED),而天数时间戳大约为1.4x10 ^ 9(所有值均为近似值),因此请考虑将两个表中该列的数据类型从BIGINT
更改为{ {1}}或INT UNSIGNED
2:ROW_FORMAT是COMPACT,可能会导致BTREE索引(source)出现问题。您正在处理INT数据类型,因此FIXED的ROW_FORMAT就足够了,所以尝试在两个表上更改为DATETIME
3:如果总是期望从table2为table1行返回行,那么INNER JOIN将比LEFT JOIN更有效