索引每列添加外键

时间:2016-11-15 13:19:11

标签: mysql indexing foreign-keys

我目前正在学习外键并尝试在我的应用程序中尽可能多地添加外键以确保数据完整性。我在Mysql上使用INNODB。

我的vs = v1 + v2 表的结构类似于......

clicks等约12个_id列。

显然这些都指向其他表,所以我应该在它们上面添加一个外键吗? MySQL正在为每个外键自动创建一个索引,所以基本上我会在每一列上都有一个索引?这是我想要的吗?

仅供参考 - 这张桌子基本上是我最笨重的桌子。我的研究基本上告诉我,我牺牲性能的完整性,但并没有暗示性能下降会有多严重。

3 个答案:

答案 0 :(得分:0)

通用答案是,如果您认为数据项非常重要以至于您为可能的值创建了查找表,则应创建外键关系以确保您没有获得任何孤立记录。

但是,您应该重新考虑点击表中的所有数据项(字段)是否需要查找表。例如,ip_id字段可能代表IP地址。您只需将IP地址直接存储在点击表中,就不需要查找表,因为IP地址的范围很广,IP地址也是唯一的。

根据对字段的重新评估,您可以减少相关表的数量,从而减少外键和索引的数量。

答案 1 :(得分:0)

以下三点需要考虑:

  1. 此表上的读写比例是多少?如果你的阅读频率比写作要多得多,那么更多的索引可能会很好,但如果是另一种方式,那么维护这些索引的成本就越难以承受。
  2. 有些外键不是很有选择性吗?如果您在gender_id列上有索引,则可能是浪费空间。我的一般规则是没有包含列的索引应该有大约1000个不同的值(除非值是唯一的),然后从那里进行调整。
  3. 是否很少或永远不会将某些外键用作查询的过滤器?如果您有一个last_modified_user_id字段,但您从未有任何查询会返回特定用户上次修改过的项目列表,那么该字段上的索引就不那么有用了。
  4. 关于索引的一点知识可以有很长的路要走。我推荐http://use-the-index-luke.com

答案 2 :(得分:0)

在插入这样一行之前,你做了12次插入或查找以获取ID,对吗?然后,当您执行INSERT时,它将执行12次检查以验证所有这些ID是否匹配。何必;你刚刚用代码验证了它们。

当然,让FK正在开发中。但是在制作中,你应该已经清除了所有的编码错误,所以FK是一种浪费。

相关提示 - 不要一次完成所有工作。将原始(尚未规范化)数据放入临时表中。定期执行批量操作以添加新的规范化密钥并返回_id。 然后将它们移入真实的'表。这具有减少对桌子上的读取的干扰的附加优点。如果您期望每秒插入超过100次,请进一步讨论。