2015-03-18 56 views
0

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

回答

1

UUID/GUID存在“随机”问题。这导致难以缓存数据。 “下一个”UUID可以位于表/索引中的任何位置。如果整个数据(或索引)不足以容纳缓存,则可能会导致磁盘命中。

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

这可以作为两个字段来实现:PRIMARY KEY (machine, seq)或作为单个数字中的值的组合。示例:机器1的ID以1000000000开始;机器2具有以2000000000开始的ID;等等。(当然,你必须仔细设计数字以避免任何一个部分的空间用完。)

INSERT会在每台机器上打一个“热点”。如果SELECT倾向于获取“最近”的行,那么它们也会触及热点,而不是整个表。

在MySQL中,该化合物PK可能是:

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

是的,这是足以使AUTO_INCREMENT工作。

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