在一对零/一对的关系中,(MySQL,InnoDB)通过使用外键作为主键是否可以提高性能?

时间:2019-05-16 11:17:43

标签: mysql schema innodb

因此,阅读这个古老的blog post(可以说是相当古老了),使我对如何构造一些表关系有了一些想法。

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

Users : id, name, country, etc.

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

在用户可能有或没有邮箱但最多有一个邮箱的情况下,摆脱“ id”作为user_mailboxes表的主键并将外键设置为主键会更有效吗?

根据我对InnoDB的了解,通过这种方式,我们将为相应的主键保存任何二级索引查找,并能够直接使用User.id查找相关的邮箱信息。

所以更类似于此

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

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

在索引存储和随机查找方面应该有更好的表现吗?尤其是如果我考虑根据某些用户条件一次获取一堆邮箱?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

  • 由于执行的检查,FOREIGN KEY 会降低插入。 (但这对性能影响不大。)

  • 没有“需要”任何FK的存在。 (除了某些教科书。)

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

  • INDEXes可以对SELECTs的性能产生重大影响。

  • 此技巧可以将“重要”查询转移到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
    
  • 如果您具有“自然”主键,请使用它并抛弃auto_increment。 (在某些情况下,这会有所帮助;在某些情况下,会有所帮助。)