【问题标题】:MySQL Partitioning - Error by Primary key and Unique recordsMySQL 分区 - 主键和唯一记录错误
【发布时间】: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


【解决方案1】:

由于您的查询将在其中使用 theyear,因此按 RANGE 分区将有助于处理大数据,并使用适当的 INDEX。

不要使用KEY()分区,保留你现有的主键

INDEX IDX_theyear(theyear)

PARTITION BY RANGE (theyear) ( 
PARTITION p0 VALUES LESS THAN (2017), 
PARTITION p1 VALUES LESS THAN (2018), 
PARTITION p2 VALUES LESS THAN (2019), 
PARTITION p3 VALUES LESS THAN (2020)

例如。您可以稍后添加更多分区,但更难。如果您的数据较旧,那么显然从最旧的年份开始

【讨论】:

  • 我得到:“#1503 - PRIMARY KEY 必须包含表分区函数中的所有列”,正如我在问题中所说...
猜你喜欢
  • 1970-01-01
  • 2012-03-22
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多