我对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'
所以,我的问题是
我担心执行此查询一年有4000万行。所以,非常感谢任何帮助。
答案 0 :(得分:1)
要加速 查询,请摆脱分区。
修剪失败了(我认为),因为它没有用于选择分区的常量。而是JOIN
到达所有分区。除了一个之外的所有内容都没有返回任何内容,其中包含A_REF的那个返回了行,就好像它是一个非分区的表一样。
有很多情况下分区没有帮助性能;你好像找到了一个受伤的地方。