因此,阅读这个古老的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.
在索引存储和随机查找方面应该有更好的表现吗?尤其是如果我考虑根据某些用户条件一次获取一堆邮箱?
答案 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。 (在某些情况下,这会有所帮助;在某些情况下,会有所帮助。)