在一对 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
(如果一个不存在)。
INDEXes
对 SELECTs
.
的性能有很大影响
这个技巧可以将 '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。 (在某些情况下,这对整体有帮助;在某些情况下,它会造成伤害。)
因此,阅读这篇旧 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
(如果一个不存在)。INDEXes
对SELECTs
. 的性能有很大影响
这个技巧可以将 '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。 (在某些情况下,这对整体有帮助;在某些情况下,它会造成伤害。)