MySQL外键约束介绍
InnoDB是目前MySQL中唯一支持外键的内置存储引擎,所以如果需要外键支持,选择不多(PBXT也支持外键)。
使用外键是有成本的。例如,外键通常要求每次修改数据时,应该在另一个表中再执行一次查找操作。尽管InnoDB强制外键使用索引,但它仍然不能消除约束检查的开销。如果外键列的选择性低,将导致非常大且低的选择性指数。例如,在一个非常大的表中有一个状态列,您希望限制该状态列的值。如果这个列只能取三个值3354,虽然这个列本身很小,但是如果主键很大,那么这个索引就会很大3354,除了外键限制,这个索引就没有其他功能了。
但是,在某些情况下,外键可以提高一些性能。如果您想确保两个相关的表始终具有一致的数据,那么使用外键的性能比在应用程序中检查一致性要高得多。此外,外键在删除和更新相关数据方面比维护应用程序更有效。但是外键维护是逐行进行的,这样的更新会比批量删除更新慢。
外键约束要求对其他一些表的额外访问,这也意味着额外的锁。如果一条记录被写入子表,外键约束会让InnoDB检查对应父表的记录,因此需要锁定父表的对应记录,以确保事务完成时不会删除这条记录。这将导致额外的锁等待,甚至一些死锁。因为不能直接访问这些表,所以这种死锁问题通常很难解决。
有时,可以使用触发器来代替外键。对于相关数据,同时更新外键更为合适,但如果外键仅作为数值约束,则最好触发或显式限制该值。(这里可以直接使用ENUM类型。)
如果只使用外键作为约束,通常最好在应用程序中实现该约束。外键会带来很多额外的消耗。这里没有相关的基准数据,但是我们遇到了很多案例。在分析性能时,我们发现外键约束是瓶颈,删除外键后性能立即得到了很大的提升。
作者:小家电维修
有时候,见面之后,就没有时间了。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/88689.html