【问题标题】:MySql, engine:MyISAM, what index can be used instead of Foreign KeyMySql,engine:MyISAM,可以用什么索引代替Foreign Key
【发布时间】:2018-01-22 16:52:52
【问题描述】:

我正在使用 MyISAM 引擎创建一个 MySQL 数据库。我相信不可能在 MyISAM 中使用外键。 DB中的所有表都有主键,但也都需要至少1个FK。

1) 是否可以使用任何其他可用选项(PK 除外):例如:UNIQUE、INDEX FULLTEXT 或 SPATIAL 来代替具有相同目的的 FK?

2)如果1)的答案是

【问题讨论】:

    标签: mysql foreign-keys primary-key innodb myisam


    【解决方案1】:

    听起来你不明白FOREIGN KEY 的用途。这是为了一件事:

    • 参照完整性。但这不是必需的,如果您编写好的代码,您可以不用它。

    FK 有一个副作用:它构建了一个INDEX。但索引的唯一目的是:

    • 更快的查找。这包括WHERE 子句和表之间的JOINs

    您需要一个 FK 到 JOIN 两个表,这是一个有点常见的误解。那是完全错误的。 INDEX 也不是必需的。

    底线...

    1. 编写架构并编写查询。
    2. 当您遇到性能问题(当您的表中有几千行时可能会发生这种情况),请考虑添加 INDEX(es)

    不管怎样,转到 InnoDB。

    【讨论】:

      【解决方案2】:

      您的问题的答案是否定的,在 MyISAM 中没有真正的替代方案。

      取决于您的 MySQL 版本。您可以在triggers 之前查看,但您必须编写一个触发器来代替您通常在 Innodb 下创建的每个外键。但不建议这样做,这样做是在重新发明轮子,如果触发器中的逻辑不正确,可能会遇到问题。打败目标。

      除非 MyISAM 的某个功能是 Innodb 无法获得的,否则我强烈建议您使用 Innodb 并在必要时进行优化。

      希望对您有所帮助。

      【讨论】:

      • 您的推荐肯定有帮助。感谢您的反馈。
      【解决方案3】:

      不,MyISAM 不支持 FK 约束。您不能在 MyISAM 中强制执行参照完整性。您可以使用触发器自己编写代码,但不建议这样做。

      您可以创建唯一或非唯一索引,以提供查询优化以进行搜索或排序。但这不提供参照完整性。

      ALTER TABLE MyTable ADD INDEX (column1, column2);
      

      ALTER TABLE MyTable ADD UNIQUE INDEX (column1, column2);
      

      不要使用 UNIQUE 索引,除非您希望列除了索引之外还有唯一约束。

      除非您打算进行全文或空间查询,否则不要使用 FULLTEXT 或 SPATIAL 索引。这些索引是为那些特殊目的而使用的,一般情况下它们不能与普通索引互换。

      为了记录,you should be using InnoDB

      【讨论】:

      • 非常感谢您的帮助。挺好用的。
      猜你喜欢
      • 2016-06-17
      • 1970-01-01
      • 2021-05-14
      • 2012-11-20
      • 2014-03-20
      • 2016-11-29
      • 2013-01-03
      • 1970-01-01
      • 2012-02-08
      相关资源
      最近更新 更多