在一对 zero/one 关系中,(MySQL, InnoDB) 使用外键作为主键是否有任何性能改进?

In a one to zero/one relationship, (MySQL, InnoDB) are there any performance improvements by using the foreign key as primary key?

因此,阅读这篇旧 blog post(老实说,它已经很老了)让我对如何构建一些 table 关系有了一些想法。

如果任何二级索引查找包含主键并且主键是访问行数据的,那么对于这种模式,

Users : id, name, country, etc.

User_Mailboxes : id, user_id, location, height, etc.

如果用户可能有也可能没有邮箱,但最多只有一个,那么去掉 'id' 作为 user_mailboxes [=30= 的主键会更有效吗? ] 并将外键设为主键?

根据我对 InnoDB 的理解,这样我们就可以保存对相应主键的任何二级索引查找,并能够直接使用 User.id 来查找相关的邮箱信息。

所以更类似于此,

Users : id (PRIMARY), name, country, etc.

User_Mailboxes : user_id(FOREIGN, PRIMARY), location, height, etc.

在索引存储和随机查找方面应该稍微更高效一些?特别是如果我考虑根据某些用户标准一次获取一堆邮箱?

在 1:0..1 关系中,您可以(并且应该)这样做,是的。我也会这样做。无论如何,存储不需要的信息都不好。
但是,当您没有获得您想象的那么多性能时,请不要失望。如果您没有一次抓取大量 users/mailboxes,您将不会注意到很多或任何东西。

  • A FOREIGN KEY 减慢 插入,因为执行了检查。 (但这对性能影响很小。)

  • 无 "requires" 任何 FK 的存在。 (部分教科书除外。)

  • A FOREIGN KEY 隐式创建一个 INDEX(如果一个不存在)。

  • INDEXesSELECTs.

  • 的性能有很大影响
  • 这个技巧可以将 'important' 查询转移到 PRIMARY KEY。这个技巧使得按范围获取 PK 可以利用集群。

      -- Instead of
    PRIMARY KEY (id),
    INDEX (foo)
      -- change to
    PRIMARY KEY (foo, id),   -- `id` included to achieve UNIQUEness
    INDEX (id)   -- to keep AUTO_INCREMENT happy
    
  • 如果您有 'natural' 主键,请使用它并丢弃 auto_increment。 (在某些情况下,这对整体有帮助;在某些情况下,它会造成伤害。)