关于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、加了外键之后必须先删子表,再删主表,而更多情况下都是先对主表做逻辑删除,再对子表做统一处理。

相关推荐
HashData酷克数据4 分钟前
官宣:Apache Cloudberry (Incubating) 2.0.0 发布!
数据库·开源·apache·cloudberry
秋难降4 分钟前
SQL 索引突然 “罢工”?快来看看为什么
数据库·后端·sql
TDengine (老段)34 分钟前
TDengine 时间函数 TODAY() 用户手册
大数据·数据库·物联网·oracle·时序数据库·tdengine·涛思数据
码界奇点43 分钟前
KingbaseES一体化架构与多层防护体系如何保障企业级数据库的持续稳定与弹性扩展
数据库·架构·可用性测试
悟乙己1 小时前
数据科学家如何更好地展示自己的能力
大数据·数据库·数据科学家
皆过客,揽星河1 小时前
mysql进阶语法(视图)
数据库·sql·mysql·mysql基础语法·mysql进阶语法·视图创建修改删除
tuokuac2 小时前
Redis 的相关文件作用
数据库·redis·缓存
鹧鸪云光伏与储能软件开发3 小时前
投资储能项目能赚多少钱?小程序帮你测算
运维·数据库·小程序·光伏·光伏设计软件·光伏设计
2301_779503765 小时前
MySQL主从同步--主从复制进阶
数据库·mysql
beijingliushao5 小时前
58-正则表达式
数据库·python·mysql·正则表达式