选择分布式数据库的主键

时间:2015-03-18 20:55:48

标签: mysql oracle database-design oracle11g primary-key

我正在实现一个应用程序,其中Oracle 11G中有一个数据库和多个其他MySQL数据库。所有数据库至少在30分钟后将彼此同步。最初我想把GUID / UUID作为主键实现,但后来我遇到了它在innodb中的缺点并且没有多担心。
我只是希望我的主键是独特的,具有良好的性能,这意味着我肯定在寻找索引。请建议我应该保留什么作为我的主键。值得一提的是,我的数据库MySQL将在简单的intel corei3上运行,我希望它上面有一百万条记录;而oracle将在不是问题的服务器上运行。

1 个答案:

答案 0 :(得分:1)

UUID / GUID存在"随机"的问题。这导致难以缓存数据。 "下一个" UUID可以位于表/索引中的任何位置。如果整个数据(或索引)不够小,不适合缓存,那么它可能会导致磁盘命中。

如果您需要在多个服务器中生成ID,或许最好的方法是拥有一个由两部分组成的ID。第一部分是代表id的来源的小数字,第二部分是某种形式的序列。

可以将其作为两个字段实现:PRIMARY KEY (machine, seq)或作为单个数字中值的组合。示例:计算机1的ID为1000000000;机器2的ID为2000000000;等等(当然,您必须仔细设计数字,以避免任何一个部分的空间不足。)

INSERT将会击中一个热点"每台机器。如果SELECTs倾向于获取"最近"行,然后他们也会打热点,而不是整个表。

在MySQL中,化合物PK可以是:

seq ... AUTO_INCREMENT,
machine TINYINT UNSIGNED NOT NULL,
PRIMARY KEY(machine, seq),
INDEX(seq)

是的,这足以使auto_increment正常工作。

在MySQL中,单列PK需要某种形式的序列模拟。