【问题标题】:Selection of Primary Key for distributed databases分布式数据库主键的选择
【发布时间】:2015-05-21 20:27:00
【问题描述】:
我正在实现一个应用程序,其中将有一个 Oracle 11G 数据库和多个其他 MySQL 数据库。所有数据库将至少在 30 分钟后相互同步。最初我想将 GUID/UUID 实现为主键,但后来我在 innodb 中遇到了它的缺点,并没有担心。
我只希望我的主键具有良好的性能是唯一的,这意味着我肯定在寻找索引。请建议我应该保留什么作为我的主键。值得一提的是,我的数据库 MySQL 将在简单的 intel corei3 上运行,我希望上面有 100 万条记录;然而,oracle 将在没有问题的服务器上运行。
【问题讨论】:
标签:
mysql
oracle
database-design
oracle11g
primary-key
【解决方案1】:
UUID/GUID 存在“随机”的问题。这导致难以缓存数据。 “下一个”UUID 可以在表/索引中的任何位置。如果整个数据(或索引)不够小,无法放入缓存,那么它可能会导致磁盘命中。
如果您需要在多个服务器中生成 id,也许最好的方法是拥有一个由两部分组成的 id。第一部分是一个小数字,代表id的来源,第二部分是某种形式的序列。
这可以作为两个字段实现:PRIMARY KEY (machine, seq) 或作为单个数字中的值的组合。示例:机器 1 的 id 以 1000000000 开头;机器 2 的 id 以 2000000000 开头;等(当然,您必须仔细设计数字以避免任何部分的空间不足。)
INSERT 会在每台机器上命中一个“热点”。如果 SELECT 倾向于获取“最近的”行,那么它们也会命中热点,而不是整个表。
在 MySQL 中,复合 PK 可以是:
seq ... AUTO_INCREMENT,
machine TINYINT UNSIGNED NOT NULL,
PRIMARY KEY(machine, seq),
INDEX(seq)
是的,这足以使 auto_increment 起作用。
在 MySQL 中,单列 PK 需要某种形式的序列模拟。