0

我对MySQL中的分区和连接表有疑问。 我有这个示例模式: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

加快查询,摆脱分区。

修剪失败(我认为),因为它没有一个常数来选择分区。相反,JOIN到达所有分区。除了一个都没有返回任何内容,其中有A_REF的那个返回行,就好像它是一个非分区表。

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

+0

感谢您的解释。我不能将你的答案标记为最终答案,但它是有帮助的,对我来说这一切都很重要。那谢谢啦。 – 2015-06-16 06:00:11