首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL外键如何工作?(Innodb)

问MySQL外键如何工作?(Innodb)
EN

Stack Overflow用户
提问于 2017-03-08 10:24:55
回答 2查看 511关注 0票数 0

我在Innodb中使用了MySQL外键,我想知道当我们插入到子表中时,Mysql是如何执行外键约束的。Innodb似乎自动在外键列上构建索引,这个特性在强制执行外键约束方面有什么用处?总而言之,对于普通索引,我们可以创建使用B+树结构的索引文件。外键使用什么结构?

EN

回答 2

Stack Overflow用户

发布于 2017-03-11 09:23:17

这是一个普通的INDEX。尤其是BTree。

SHOW CREATE TABLE将证明它就是这样的(并且索引有一个伪造的名称)。

票数 1
EN

Stack Overflow用户

发布于 2017-03-11 09:57:24

问:这个特性(子表中外键列上的索引)在强制执行外键约束方面有什么用处?

答:当试图删除父表中的一行时,它很有用。或者当尝试更新由外键引用的列中的值时。

例如,考虑尝试删除父表中的一行。外键是一个约束,它说明:如果子表中有任何行引用了父表中的行,则删除操作将不会成功,并将返回错误。(出于本例的目的,我们假设外键约束声明为ON DELETE RESTRICT。)

当从父表中删除一行时,需要检查子表。考虑到在子表上运行查询来执行该检查,以找出:子表中是否有引用父表中的行的行。(也就是说,它们是在外键列中具有特定值的任何行吗?)

如果数据库没有强制执行约束,而我们在应用程序中执行检查,则需要运行类似以下内容的查询:

代码语言:javascript
复制
  SELECT 1
    FROM child_table
   WHERE foreign_key_col = :referenced_key_value
   LIMIT 1

并且该查询将受益于合适的索引以及以foreign_key_col作为前导列的索引。使用索引,MySQL可以快速消除它知道不能具有该值的大量行,从而非常迅速地缩小到包含匹配行的块。

对于非平凡的集合,使用适当的索引来定位行比执行完全扫描操作、检查表中的每一行来验证没有匹配的行要高效得多。

在本例中,理想的索引... ON child_table (foreign_key_column),...)`

除了性能优势之外,数据库还可以使用索引来防止其他会话通过锁定机制将行插入到child_table (违反外键约束行)中。如果没有索引,数据库将需要锁定整个child_table。这会扼杀并发性。

(这是一个过于简单的解释。实际的机制涉及更多。但这应该可以解释为什么外键列上的索引是“有用的”。要定义外键约束,InnoDB要求定义合适的索引。如果不存在,InnoDB将创建一个。

问:外键使用什么结构?

与表中任何其他列或表中任何其他索引使用的结构相同。

FOREIGN KEY是一种约束。在foreign key约束中使用的列没有什么“特殊”。要求外键约束中使用的列必须是索引中的前导列。正如你第一个问题的答案所解释的那样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42661856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档