【问题标题】: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 需要某种形式的序列模拟。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-21
      相关资源
      最近更新 更多