我在Innodb中使用了MySQL外键,我想知道当我们插入到子表中时,Mysql是如何执行外键约束的。Innodb似乎自动在外键列上构建索引,这个特性在强制执行外键约束方面有什么用处?总而言之,对于普通索引,我们可以创建使用B+树结构的索引文件。外键使用什么结构?
发布于 2017-03-11 09:23:17
这是一个普通的INDEX。尤其是BTree。
SHOW CREATE TABLE将证明它就是这样的(并且索引有一个伪造的名称)。
发布于 2017-03-11 09:57:24
问:这个特性(子表中外键列上的索引)在强制执行外键约束方面有什么用处?
答:当试图删除父表中的一行时,它很有用。或者当尝试更新由外键引用的列中的值时。
例如,考虑尝试删除父表中的一行。外键是一个约束,它说明:如果子表中有任何行引用了父表中的行,则删除操作将不会成功,并将返回错误。(出于本例的目的,我们假设外键约束声明为ON DELETE RESTRICT。)
当从父表中删除一行时,需要检查子表。考虑到在子表上运行查询来执行该检查,以找出:子表中是否有引用父表中的行的行。(也就是说,它们是在外键列中具有特定值的任何行吗?)
如果数据库没有强制执行约束,而我们在应用程序中执行检查,则需要运行类似以下内容的查询:
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约束中使用的列没有什么“特殊”。要求外键约束中使用的列必须是索引中的前导列。正如你第一个问题的答案所解释的那样。
https://stackoverflow.com/questions/42661856
复制相似问题