2009-10-14 52 views
1

我有一个非常大的表,它目前大约70M行,每天增长数千,这个模式现在每天都在翻转,所以我正在转向分区表,重新设计ddl。mysql 7列pk对1列md5唯一约束

表是basicly NOT NULL整数集合(一些媒体有些INT一些微小的) 这就需要有一组7列(该表中有更多的列),这是非常昂贵的唯一约束计算每插入,并进一步增加索引文件的大​​小,因为我从来没有检索它,我宁愿放弃它,并以某种方式md5 /可能简单concat的值...还不知道。

问题是,唯一可以容纳这么大的唯一编号的列类型是varchar我在质疑这个PK是否会更好? allso因为我将有一个PRIMARY KEY'part_key'(site_id,id)我将不得不 在设计分区的独特约束,总结... 我敢肯定,这不是一个新问题,但我无法找到任何比较两者的基准/文档,有没有人有任何这个问题的经验? 这个问题是真的应该PK是整个8个字段(请记住,这张表可能会有更多的100M行),当我从来没有通过PK检索或只是一个独特的字段的散列值 PS:检索主要是由7列中的2列完成的 磁盘大小不是问题 谢谢。

回答

0

直到mysql获取分区修剪,我建议(吞噬)非规范化您的表虚假分区。做类似于你的第一个值的模32并制作32个表。

更新:明显的mysql 5.1.6及更高版本支持修剪(http://dev.mysql.com/doc/refman/5.1/en/partitioning-pruning.html),所以我强烈建议是升级,然后让MySQL来处理分区的你,可能是使用的7列一个的哈希值。

0

如果您可以找到与您的记录查找匹配的良好散列,那么在每个分区上应用您的唯一约束应该不是什么大问题。较小的分区大小将使您的独特约束更便宜。 (如果我错了,我肯定会有人在这里上学)。

我困在MySQL 5.0上。我正面临手动将40M行的几个表分区。我有一个文件ID,我可以在我的应用程序中散列:floor(docID/10)%100。这可以给我100个分区,并应显著让我的索引大小下来。我做对表的查询,并通过哈希计数的行数:

select count(docID), floor(docID/10)%100 as partno 
from documents 
group by partno 

幸运的是,我找到了我的第一次尝试非常均匀分布。你自己的公式将是不同的,我不知道你的分配将是什么样子。您是否担心在分区面对你的唯一约束不上了呢?

如果你可以利用MySQL的分区,它会更强大和更小的应用程序产生影响。