关于MySQL的一些相关规定

1.为什么阿里巴巴规定不能超过三张表join

之所以不建议使用join查询,最主要的原因就是join的效率比较低。

MySQL是使用了嵌套循环(Nested-Loop Join)的方式来实现关联查询的,简单点说就是要通过两层循环,用第一张表做外循环,第二张表做内循环,外循环的每一条记录跟内循环中的记录作比较,符合条件的就输出。

而具体到算法实现上主要有simple nested loop,block nested loop和index nested loop这三种。而且这三种的效率都没有特别高。

MySQL是使用了嵌套循环(Nested-Loop Join)的方式来实现关联查询的,如果有2张表join的话,复杂度最高是O(n2),3张表则是O(n3)...随着表越多,表中的数据量越多,JOIN的效率会呈指数级下降。

2.为什么不推荐使用外键

MySQL外键用于建立表之间的关系,它定义了一个表中的一列或一组列,这些列的值必须在另一个表的主键列中存在。

MySQL外键最大的作用是有助于维护数据的一致性和完整性

  • 一致性:如果一个订单表引用了一个客户表的外键,外键可以确保订单的客户 ID 存在于客户表中,从而保持数据的一致性。
  • 完整性:外键可以防止在引用表中删除正在被其他表引用的记录,从而维护数据的完整性。

但是,在很多互联网大厂中很少使用外键

外键存在的问题

  • 1.性能问题:外键会增加数据哭的负担,每次插入、更新或者删除的时候,数据库都需要检查外键约束的完整性。首先,在数据库中可能会多个外键约束,这使得在每次插入、更新、删除的时候,数据库都需要维护这些外键,这使得会导致性能开销。其次,在插入新数据时,数据库都需要一致性的检查确保引用的数据编号在表中存在,这额外的增加了数据插入的执行时间

  • 2.锁竞争问题

    当多个事务同时尝试插入数据时,它们需要检查表,就需要获得额外的锁,以确保一致性,这可能导致事务之间的锁竞争,降低并发性能。

    一旦发起锁竞争可能会带来更加严重的死锁问题

  • 3.无法适应分库分表

    当数据量大时,这时就需要考虑分库分表了,但在分库分表环境中,相关数据可能分布在不同的数据库中,外键通常难以跨越不同的数据库建立连接,分库分表环境中,数据的一致性可能更难维护。跨库事务搞不定。

  • 4.逻辑删除

    我们在很多时候,都不会直接删除数据,而是通过逻辑删除进行,而外键在逻辑删除中会有一些约束。如:

1、外键是一种物理约束,而我们业务当中更多用的是逻辑删除。

2、加了外键之后必须先删子表,再删主表,而更多情况下都是先对主表做逻辑删除,再对子表做统一处理。

相关推荐
小白男神2 天前
MySQL进阶学习四(存储过程、游标、触发器)
mysql
这个DBA有点耶2 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G2 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备2 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
科创致远2 天前
科创致远 ESOP 系统核心效能与实战价值展示
大数据·数据库·人工智能·精益工程
kybs19912 天前
全球灾害数据分析可视化 毕业设计-附源码66794
vue.js·spring boot·mysql·安全·django·c#·asp.net
2601_962218612 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法
程序猿_极客2 天前
【免费】分享一套优质的基于SSM的校园失物招领系统的设计与实现,源码+文档+视频详解(讲解)
java·mysql·ssm·课程设计·失物招领系统
张洛闻Eren2 天前
k8s云原生【第十课】:水平 Pod 自动扩缩容
运维·数据库·云原生·kubernetes·github
于平安2 天前
MySQL-触发器
数据库·mysql