赞
踩
外键(Foreign Key)是用于建立表与表之间关系的,它定义了一个表中的列值依赖另外一张表中主键的值。
Mysql外键最主要的作用就是维护数据的一致性和完整性。
其实,在很多大厂中是很少使用外键,甚至很多大厂中明文规定禁止使用外键。因为,外键与级联更新适用于单机低并发,不适合分布式高并发集群。级联更新是强阻塞,存在数据库更新风暴的风险。此外,外键会影响数据库的插入速度。所以,在某些高并发的场景,大厂会选择不使用外键以换取更高的写入性能。
首先,我们在前面已经提到过,最主要的就是性能问题。外键会增加数据库的维护负担,因为每次插入、更新或删除时,数据库都需要检查约束的完整性。
其次,就是索引的问题。有了外键约束,从表中有一个外键索引。这就使得每次插入、更新、删除时,数据库都需要维护这个索引,这就会导致额外的性能开销。
锁竞争的问题是比较容易忽略的,当有多个事务同时插入或更新从表时,它们就需要去检查主表。这时就需要获得额外的锁,以确保一致性。这可能会导致事务之间的锁竞争,降低并发性能。
当单表数据量过大,影响查询性能时,通常会进行分库分表。在分库分表的场景中,相关的数据可能分布在不同数据库中,这时外键就不能跨越不同的数据库来建立联系了。此外,分库分表环境中,数据的一致性很难维护,还涉及跨库事务等问题。
现在有些场景会适用逻辑删除,所谓逻辑删除就是不会真正将数据从表中删除,而是通过一个is_delete字段来进行软删除。外键是一种物理约束,而业务中使用的是逻辑删除。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。