【问题标题】:Index every column to add foreign keys索引每一列以添加外键
【发布时间】:2016-11-15 13:19:10
【问题描述】:

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

我的clicks 表的结构类似于...

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

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

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

【问题讨论】:

    标签: mysql indexing foreign-keys


    【解决方案1】:

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

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

    相关提示 - 不要一次完成所有工作。将原始(尚未标准化的)数据放入临时表中。定期执行批量操作以添加新的规范化密钥并获取 _id。 然后将它们移到“真实”表中。这具有减少对表上读取的干扰的额外优势。如果您预计每秒插入次数超过 100 次,让我们进一步讨论。

    【讨论】:

      【解决方案2】:

      一般的答案是,如果您认为某个数据项非常重要以至于您为可能的值创建了一个查找表,那么您应该创建一个外键关系以确保您不会获得任何孤立记录。

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

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

      【讨论】:

        【解决方案3】:

        这里有三件事需要考虑:

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

        一点点关于索引的知识可以大有帮助。我推荐http://use-the-index-luke.com

        【讨论】:

          猜你喜欢
          • 2011-01-19
          • 2016-01-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多