【问题标题】: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 也不是必需的。
底线...
- 编写架构并编写查询。
- 当您遇到性能问题(当您的表中有几千行时可能会发生这种情况),请考虑添加
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。