【问题标题】:What to do with the auto-created index when applying a foreign key constraint in MySQL?在 MySQL 中应用外键约束时如何处理自动创建的索引?
【发布时间】:2021-08-25 16:28:01
【问题描述】:

当在 MySQL 表上放置外键约束时,MySQL 会自动添加索引以获得更好的性能。我对此完全没问题。这一切都在文档中。

但是,当删除外键时,我注意到自动创建的索引本身并没有被删除。这不在 de docs 中。我想知道:

  1. 它会被自动删除吗,因为 MySQL 也为我创建了它?
  2. 外键索引可以有多大?如果它只有几千字节,我不介意,但如果它变大了怎么办……?

https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html 只这么说:

MySQL 需要外键和引用键的索引,以便 外键检查可以很快并且不需要表扫描。在里面 引用表,必须有外键所在的索引 列按相同顺序列为第一列。这样一个 如果没有,则在引用表上自动创建索引 存在。如果您创建,此索引可能会在稍后被静默删除 另一个可用于强制外键约束的索引。 index_name,如果给定,则如前所述使用。

【问题讨论】:

    标签: mysql indexing


    【解决方案1】:

    外键索引就像一个普通的二级索引。它将与表中的行数和索引列中的数据类型成比例增长。

    如果您运行需要它的查询,拥有此索引可能仍然有用。在 MySQL 部署中通常避免外键约束,但保留索引以支持优化连接或搜索。

    如果您不需要该索引,即如果您没有使用该索引的查询,那么您可以删除它。

    【讨论】:

    • 谢谢,你能告诉我为什么你把它叫做避免外键通用吗?为什么你不应该使用它,因为这会强制完整性?其次,我正在使用一个框架,该框架使用应用外键的迁移。删除外键时,框架不应该也清理 MySQL 创建的索引吗?
    • 就像我上面所说的,索引可能仍然有助于优化某些查询。您必须决定是否要删除索引。
    • 外键有利于加强参照完整性,但会阻碍其他操作。例如,如果您正在进行数据清理工作,您可能需要暂时拥有孤立记录。或者,如果您使用分区表。或者您使用 table-rename 作为归档表的方法。
    • 另一个原因是锁定。如果您更新子行,您就知道它会锁定该行。但它也会将外键引用的父行锁定在子行中。这可能会导致某些应用程序中的锁争用,这是开发人员没有预料到的。
    猜你喜欢
    • 2019-01-04
    • 2022-01-02
    • 2018-05-01
    • 2016-09-27
    • 2014-02-26
    • 1970-01-01
    • 2016-01-15
    • 2021-10-06
    相关资源
    最近更新 更多