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

相关推荐
BullSmall1 小时前
Another Redis Desktop Manager(ARDM)下载指南
数据库·redis·缓存
SelectDB1 小时前
Apache Doris 倒排索引工作原理:全文检索提速 59 倍,点查提速 14 倍
数据库
码农颜1 小时前
5.1.1 原⼦性
数据库·mysql
机建狂魔2 小时前
Codex 接入第三方模型 API 实战:以 Mimo 为例
java·服务器·数据库·ai·ai编程·codex
山峰哥2 小时前
数据库工程与SQL调优:从慢查询到秒级响应的实战之路
java·开发语言·数据库·sql·深度优先·启发式算法
moMo3 小时前
# 向量数据库入门:从"关键词匹配"到"语义理解"
数据库
ACP广源盛139246256733 小时前
DeepSeek‑V4‑Flash 公测@ACP#昇腾 950 国产算力组合落地,国产 PCIe 交换芯片 IX9104 有哪些硬件机会
大数据·数据库·人工智能·分布式·单片机·嵌入式硬件·microsoft
进击的女IT3 小时前
通过mysql中的Data目录恢复数据库数据
数据库·mysql
yuezhilangniao3 小时前
AI工具全家桶:从开发到运维,从数据库到产品经理-含魔塔社区简介
运维·数据库·人工智能
gb42152873 小时前
ChromaDB向量数据库的特点
数据库