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