我是分区的新手。当我试图在我们的数据库中的表中使我们的新'url_hash'
列唯一时,我不知道它存在但是意识到了。并收到错误消息:
UNIQUE INDEX必须包含表格分区函数中的所有列
这是一个由我不认识且又不参与该项目的人创建的数据库。
我试过阅读mysql文档并在论坛上阅读有关分区的内容。它是什么以及如何运作。理解目的,将表格“划分”为几个“部分”,以便检索相关数据变得更快。一个常见的例子是分区为年间隔。但大多数示例都显示了手动方法。例如,您决定的时间少于三个特定年份。例如:
PARTITION BY RANGE ( YEAR(separated) ) (
PARTITION p0 VALUES LESS THAN (1991),
PARTITION p1 VALUES LESS THAN (1996),
PARTITION p2 VALUES LESS THAN (2001),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
但在我们的表中,分区是以这种方式创建的:
PARTITION BY HASH ( `feeditemsID` + YEAR(`feeddate`))
PARTITIONS 3;
这是什么意思?我们的分区如何工作?
feeditemsID
是表格中每一行的唯一ID。
答案 0 :(得分:2)
使用散列分区时,通过计算表达式feaditemsID + YEAR(feeddate)
中的散列码,然后通过分区数查找此代码的模数来确定包含每个记录的分区。因此,如果行的哈希码为123,则会计算123 % 3
,即0
,因此记录会进入分区0
。
MySQL documentation中解释了这一点。
如上所述,
注意强>
如果要分区的表具有UNIQUE键,则作为HASH用户函数或KEY的 column_list 的参数提供的任何列都必须是该键的一部分。
在您的情况下,表的主键必须是:
PRIMARY KEY (feeditemsID, feeddate)
假设feeditemsID
已经是唯一的(可能是自动增量列),只要保持数据唯一性,将feeddate
添加到主数据库是多余的,但需要满足分区需求。将feeditemsID
置于复合键的第一位将允许它自己用于优化表查找。
此要求可能是因为每个分区都有自己的索引。插入/更新行并检查唯一性时,它仅检查将存储该行的分区的索引。因此,当它使用散列函数找到分区时,需要确保该分区将唯一地包含索引列。
有关详细信息,请参阅