为什么mysql会自动为外键检查添加索引?

为什么mysql会自动为外键检查添加索引?,mysql,Mysql,我知道mysql会这样做,但我不太明白为什么。如果有一个子表引用父表,我就会理解为什么父表上需要索引。插入时,必须查找该表中是否存在行 但是为什么会在子表中自动创建索引呢?mysql什么时候使用此索引?如果在DELETE CASCADE上使用和DELETE SET NULL上使用等选项,则必须找到所有相关的子行,并且需要索引来提高效率 即使不使用这些选项,检查外键也需要比较父表和子表中的列。在这两个表中都需要索引,这样就可以只使用索引而不是读取整行,这样效率更高。如果在DELETE CASCAD

我知道mysql会这样做,但我不太明白为什么。如果有一个子表引用父表,我就会理解为什么父表上需要索引。插入时,必须查找该表中是否存在行


但是为什么会在子表中自动创建索引呢?mysql什么时候使用此索引?

如果在DELETE CASCADE上使用
和DELETE SET NULL上使用
等选项,则必须找到所有相关的子行,并且需要索引来提高效率


即使不使用这些选项,检查外键也需要比较父表和子表中的列。在这两个表中都需要索引,这样就可以只使用索引而不是读取整行,这样效率更高。

如果在DELETE CASCADE上使用
和DELETE SET NULL上使用
等选项,则必须找到所有相关的子行,并且需要索引才能提高效率



即使不使用这些选项,检查外键也需要比较父表和子表中的列。在两个表中都需要索引,这样就可以只使用索引而不是读取整行,这样效率更高。

为了提高匹配行的效率,可以只使用索引而不必读取整行。澄清此问题的一种方法是添加您创建的两个表结构,并显示作为结果创建的索引。您甚至尝试过自己查找它吗?使用谷歌,第一个结果就是一个解释,因此在@Ibu上有一个答案。这是一个关于MySQL如何工作的一般性问题,而不是一个特定的表结构。还有一个想法,外键通常被用作连接条件,或者通常根据键进行查找。。。“现在我们已经有了该对象的id,让我们获取与该对象相关联的数据”。为了提高匹配行的效率,只需使用索引即可完成匹配,而无需读取整行。澄清此问题的一种方法是添加您创建的两个表结构,并显示作为结果创建的索引。您甚至尝试过自己查找它吗?使用谷歌,第一个结果就是一个解释,因此在@Ibu上有一个答案。这是一个关于MySQL如何工作的一般性问题,而不是一个特定的表结构。还有一个想法,外键通常被用作连接条件,或者通常根据键进行查找。。。“现在我们已经有了这个东西的id,让我们来获取与该东西相关联的数据”。因此,为了证实我的理解:插入行时,父表上使用了一个索引;只有在从父表中删除条目时才需要子表上的索引?在更新行时也会使用子表上的索引,以防更改外键。当您在外键上进行连接时(这是常见的),它们都会被使用。使用on DELETE RESTRICT、on DELETE NO ACTION、on UPDATE CASCADE等。当尝试从父表中删除行或修改行时,数据库需要确认子表中没有相关行。如果没有合适的索引可用,则需要进行完整扫描,这在性能方面会有问题。InnoDB实际上需要在定义外键时提供合适的索引;InnoDB可能被设计为返回错误;但他们选择了自动创建索引的设计+10如果引用的表中缺少索引,则会发出错误信号。他们不希望一个表上的操作自动修改其他表,但修改同一个表是合理的;只有在从父表中删除条目时才需要子表上的索引?在更新行时也会使用子表上的索引,以防更改外键。当您在外键上进行连接时(这是常见的),它们都会被使用。使用on DELETE RESTRICT、on DELETE NO ACTION、on UPDATE CASCADE等。当尝试从父表中删除行或修改行时,数据库需要确认子表中没有相关行。如果没有合适的索引可用,则需要进行完整扫描,这在性能方面会有问题。InnoDB实际上需要在定义外键时提供合适的索引;InnoDB可能被设计为返回错误;但他们选择了自动创建索引的设计+10如果引用的表中缺少索引,则会发出错误信号。他们不希望一个表上的操作自动修改其他表,但修改同一个表是合理的。