2016-02-25 32 views
1

我是新来的分区。不知道它是否存在,但是当我试图在数据库的表格中使我们新的'url_hash'列独一无二时才意识到。并得到了错误信息:散列(行ID +年)分区是如何工作的?

唯一索引必须包括表的分区函数的所有列

这是由其他人创建的数据库,我不知道,谁不参与该项目了。

我试图读取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

是您了解如何散列分区作品的问题,或有关如何解决你的错误? – Barmar

+0

好吧,两者。我想通过了解这种分区是如何工作的,我可能能够避免错误。我想知道解决方案的工作原理。 –

回答

2

当您使用散列分区时,通过计算来自表达式feaditemsID + YEAR(feeddate)的散列码,然后通过分区数找到此代码的模数,从而确定包含每条记录的分区。因此,如果某一行的散列码为123,则它会计算123 % 3,即0,因此记录将进入分区0

这在MySQL documentation中有解释。

如前所述那里,

注意
如果要分区的表都有一个唯一的键,然后作为参数传递给HASH用户函数或密钥的column_list中提供的任何列必须是该关键的一部分。

在你的情况下,该表的主键必须是:

PRIMARY KEY (feeditemsID, feeddate) 

假设feeditemsID已经是唯一的(大概这是一个自动增量列),将feeddate到主要是多余的,只要保持数据的独特性,但需要满足分区要求。将feeditemsID放在组合键中将允许它自己用于优化表查找。

这个要求可能是因为每个分区都有自己的索引。当插入/更新一行并检查唯一性时,它只检查该行将被存储的分区的索引。因此,当它使用哈希函数找到分区时,需要确定此分区将唯一包含索引列。

欲了解更多信息,请参阅

Partitioning Keys, Primary Keys, and Unique Keys

+0

我不确定我是否理解。为什么'feeddate'可能需要唯一的密钥?但是,是否假设分区表是按feeditemsID ASC排序的?我想它应该是,它怎么知道如何计算以知道要在哪个分区中搜索?我应该怎么做才能让我的专栏'url_hash'独一无二?删除所有这些分区,并创建新的唯一密钥构建在包含此列的哈希上?或者是什么? –

+0

阅读引用文档:'HASH'函数中引用的所有列必须位于唯一键中。 – Barmar

+0

它通过计算“feeditemsID + feeddate”的散列值来知道要搜索哪个分区。 – Barmar