Mysql:连接表中的性能分区

时间:2014-11-24 11:56:28

标签: mysql database query-optimization partitioning database-partitioning

我对MySQL中的分区和连接表有疑问。 我有这个示例模式:

CREATE TABLE A (
`ID` BIGINT NOT NULL AUTO_INCREMENT,
`NAME` varchar(50) DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `IDX_A_NAME` (`NAME`),
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE B (
`ID` BIGINT NOT NULL AUTO_INCREMENT,
`VALUE` double(22,6) DEFAULT NULL,
`A_REF` BIGINT DEFAULT NULL,
PRIMARY KEY (`ID`),
KEY `IDX_A_REF` (`A_REF`),
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
PARTITION BY RANGE( A_REF ) (
                PARTITION p1000 VALUES LESS THAN (1000),
    PARTITION p2000 VALUES LESS THAN (2000),
    PARTITION p3000 VALUES LESS THAN (3000),
    PARTITION future VALUES LESS THAN MAXVALUE
                            );

B分区表每月增长约3百万行。 A_REF字段的分区标准是因为正在使用这样的查询访问B表(到现在为止,它无法更改):

SELECT B.VALUE
FROM A
INNER JOIN B ON A.ID = B.A_REF
WHERE A.NAME = 'James'

所以,我的问题是

  • 使用此查询执行 EXPLAIN PARTITIONS ... 时,将在EXPLAIN输出中访问所有分区。这是否意味着在执行中实际访问了所有分区?或者只是分区信息?
  • 分区条件是JOIN字段有帮助吗?
  • 我的示例中的分区有帮助吗?
  • 是否有其他方法(另一个分区标准等)有助于访问较少的行或查询执行得更快?

我担心执行此查询一年有4000万行。所以,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

要加速 查询,请摆脱分区。

修剪失败了(我认为),因为它没有用于选择分区的常量。而是JOIN到达所有分区。除了一个之外的所有内容都没有返回任何内容,其中包含A_REF的那个返回了行,就好像它是一个非分区的表一样。

有很多情况下分区没有帮助性能;你好像找到了一个受伤的地方。