当前位置:   article > 正文

Mysql中高并发场景为什么不推荐使用外键?_外键并发性能

外键并发性能

一、背景

外键(Foreign Key)是用于建立表与表之间关系的,它定义了一个表中的列值依赖另外一张表中主键的值。

Mysql外键最主要的作用就是维护数据的一致性和完整性。

  • 完整性:当从表中插入或更新的数据,必须在主表中有相应的记录。避免不存在的数据,从而保证数据的完整性。
  • 一致性:当主表中的数据被删除或更新时,可以设置级联操作,来决定从表中的关联记录应当如何处理。

其实,在很多大厂中是很少使用外键,甚至很多大厂中明文规定禁止使用外键。因为,外键与级联更新适用于单机低并发,不适合分布式高并发集群。级联更新是强阻塞,存在数据库更新风暴的风险。此外,外键会影响数据库的插入速度。所以,在某些高并发的场景,大厂会选择不使用外键以换取更高的写入性能

二、外键会带来的问题?

1. 性能问题

首先,我们在前面已经提到过,最主要的就是性能问题。外键会增加数据库的维护负担,因为每次插入、更新或删除时,数据库都需要检查约束的完整性。

其次,就是索引的问题。有了外键约束,从表中有一个外键索引。这就使得每次插入、更新、删除时,数据库都需要维护这个索引,这就会导致额外的性能开销。

2. 锁竞争的问题

锁竞争的问题是比较容易忽略的,当有多个事务同时插入或更新从表时,它们就需要去检查主表。这时就需要获得额外的锁,以确保一致性。这可能会导致事务之间的锁竞争,降低并发性能。

3. 分库分表无法适配

当单表数据量过大,影响查询性能时,通常会进行分库分表。在分库分表的场景中,相关的数据可能分布在不同数据库中,这时外键就不能跨越不同的数据库来建立联系了。此外,分库分表环境中,数据的一致性很难维护,还涉及跨库事务等问题。

4. 逻辑删除

现在有些场景会适用逻辑删除,所谓逻辑删除就是不会真正将数据从表中删除,而是通过一个is_delete字段来进行软删除。外键是一种物理约束,而业务中使用的是逻辑删除。

  • 如果外键约束没有设置级联删除(CASCADE)操作,当你在主表中对一条记录进行逻辑删除时,从表中引用了该记录的外键值的记录并不会自动做任何更改。因此,从表中仍然保留着对该主表已逻辑删除记录的引用,这可能会导致数据一致性问题。
  • 若你希望在主表记录被逻辑删除时,从表中相关记录也被逻辑删除,此时就需要在应用层自行处理,或者在数据库层面上通过触发器(Trigger)来实现。由于外键约束本身不支持对逻辑删除的级联操作,所以需要额外的逻辑来保证数据的一致性。
  • 若外键设置了级联删除(CASCADE),则在主表执行物理删除操作时,从表中相关的记录会被自动删除。但因为这里是逻辑删除而非物理删除,所以级联删除约束在这种场景下并不能自动生效。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/394843
推荐阅读
相关标签
  

闽ICP备14008679号