分布式数据库主键选择

Selection of Primary Key for distributed databases

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

UUID/GUID 存在 "random" 的问题。这导致难以缓存数据。 "next" UUID 可以在 table/index 中的任何位置。如果整个数据(或索引)不够小,无法放入缓存,那么它可能会导致磁盘命中。

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

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

INSERT 将在每台机器上执行一次 "hot spot"。如果 SELECT 倾向于获取 "recent" 行,那么它们也会命中热点,而不是整个 table.

在MySQL中,复合PK可以是:

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

是的,这足以使 auto_increment 工作。

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