2016-11-15 69 views
0

我目前正在学习外键,并试图尽可能地将它们添加到我的应用程序中以确保数据完整性。我在Mysql上使用INNODB。索引每列添加外键

clicks表中有一个结构类似...

id, timestamp, link_id, user_id, ip_id, user_agent_id, ...等约12 _id列。

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

仅供参考 - 本表将基本上是我最大的表。我的研究基本上告诉我,我牺牲了完整性的表现,但并没有表明性能下降会有多严酷。

回答

0

就在插入这样的行之前,你做了12次插入或查找来获得id,是否正确?然后,在您执行INSERT时,它将执行12次检查以确认所有这些ID都匹配。何必;您只需使用代码验证它们即可。

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

相关的提示 - 不要一次做所有的工作。将原始(尚未标准化)的数据放入登台表中。定期执行批量操作以添加新的标准化密钥并获取_id。然后将它们移动到“真实”表格中。这具有减少对表格上的读取的干扰的附加优点。如果您希望每秒钟插入超过100张,让我们进一步讨论。

0

一般的答案是,如果您认为数据项如此重要以至于您为可能的值创建了查找表,则应该创建一个外键关系以确保您没有收到任何孤立记录。

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

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

0

这里有三件事情要考虑:

  1. 什么比例来读取写入此表上?如果你阅读的次数多于写作的次数,那么更多的索引可能是好的,但如果是相反的话,维护这些索引的成本就难以承受。
  2. 一些外键是不是非常有选择性?如果您在gender_id列中有索引,则可能会浪费空间。我的一般规则是,没有包含列的索引应该有大约1000个不同的值(除非值是唯一的),然后从那里调整。
  3. 某些外键很少或永远不会用作查询的过滤器吗?如果您有last_modified_user_id字段,但您从未有任何查询返回特定用户上次修改的项目列表,则该字段上的索引不太有用。

关于索引的一点知识可以走很长一段路。我推荐http://use-the-index-luke.com