【发布时间】:2017-09-12 15:44:29
【问题描述】:
我有一个包含大约 200 万条记录的大表,我想对它进行分区。
我将 id 列设置为 PRIMARY AUTO_INCREMENT int(并且它必须始终是唯一的)。 我有一列“theyear” int(4),我想按 RANGE 从 2016 年到 2050 年进行分区,因为大多数查询使用 WHERE 语句一次获得 1 年。
进行分区时我收到一条错误消息,提示“theyear”键必须与 PRIMARY KEY 一起使用,因此我编辑了主键,执行了多列键 PRIMARY (id, theyear)。
一切正常,但我的“id”列不再是唯一的,因为它也检查“theyear”列... 所以如果我插入:
INSERT INTO table (id, theyear) VALUES (1, 2016);
INSERT INTO table (id, theyear) VALUES (1, 2017);
它说 NO ERROR,因为 UNIQUE 会同时检查 id 和年份。
如何在不丢失“id”列的唯一性的情况下实现分区?
谢谢。
【问题讨论】:
-
您是否尝试针对年份添加单独的
unique约束? -
我基于文档:dev.mysql.com/doc/refman/5.7/en/partitioning-range.html,但在我看来,您不需要更改 RANGE 分区的主键。他们使用的所有示例都没有主键。我错过了什么吗?您是否尝试通过 KEY() 错误地进行分区?
-
为什么要分区?您认为哪个查询会运行得更快?请提供该查询和
SHOW CREATE TABLE。我可能会争辩说,合适的索引将与分区一样快或更快。也许该索引将从 YEAR 开始。提示:mysql.rjweb.org/doc.php/partitionmaint -
@RickJames 我想使用分区,因为我的表现在是:13,880,195 条记录 (5.1 GiB) ...
-
@JacquesAmar 我正在尝试使用 KEY() 但我得到:“#1503 - PRIMARY KEY 必须包含表的分区函数中的所有列”
标签: mysql partitioning