MySQL查询优化之间或大于>条件

时间:2013-06-11 16:23:32

标签: mysql performance query-optimization between

问题:查询速度慢。

  • table1有大约5 000行
  • table2有大约50 000行
  • 时间戳格式为int(11)
  • MySQL - 20秒(带索引)
  • 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
;

1 个答案:

答案 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更有效