1.为什么阿里巴巴规定不能超过三张表join
之所以不建议使用join查询,最主要的原因就是join的效率比较低。
MySQL是使用了嵌套循环(Nested-Loop Join)的方式来实现关联查询的,简单点说就是要通过两层循环,用第一张表做外循环,第二张表做内循环,外循环的每一条记录跟内循环中的记录作比较,符合条件的就输出。
而具体到算法实现上主要有simple nested loop,block nested loop和index nested loop这三种。而且这三种的效率都没有特别高。
MySQL是使用了嵌套循环(Nested-Loop Join)的方式来实现关联查询的,如果有2张表join的话,复杂度最高是O(n^2),3张表则是O(n^3)...随着表越多,表中的数据量越多,JOIN的效率会呈指数级下降。
2.为什么不推荐使用外键
MySQL外键用于建立表之间的关系,它定义了一个表中的一列或一组列,这些列的值必须在另一个表的主键列中存在。
MySQL外键最大的作用是有助于维护数据的一致性和完整性
- 一致性:如果一个订单表引用了一个客户表的外键,外键可以确保订单的客户 ID 存在于客户表中,从而保持数据的一致性。
- 完整性:外键可以防止在引用表中删除正在被其他表引用的记录,从而维护数据的完整性。
但是,在很多互联网大厂中很少使用外键
外键存在的问题
-
1.性能问题:外键会增加数据哭的负担,每次插入、更新或者删除的时候,数据库都需要检查外键约束的完整性。首先,在数据库中可能会多个外键约束,这使得在每次插入、更新、删除的时候,数据库都需要维护这些外键,这使得会导致性能开销。其次,在插入新数据时,数据库都需要一致性的检查确保引用的数据编号在表中存在,这额外的增加了数据插入的执行时间
-
2.锁竞争问题
当多个事务同时尝试插入数据时,它们需要检查表,就需要获得额外的锁,以确保一致性,这可能导致事务之间的锁竞争,降低并发性能。
一旦发起锁竞争可能会带来更加严重的死锁问题
-
3.无法适应分库分表
当数据量大时,这时就需要考虑分库分表了,但在分库分表环境中,相关数据可能分布在不同的数据库中,外键通常难以跨越不同的数据库建立连接,分库分表环境中,数据的一致性可能更难维护。跨库事务搞不定。
-
4.逻辑删除
我们在很多时候,都不会直接删除数据,而是通过逻辑删除进行,而外键在逻辑删除中会有一些约束。如:
1、外键是一种物理约束,而我们业务当中更多用的是逻辑删除。
2、加了外键之后必须先删子表,再删主表,而更多情况下都是先对主表做逻辑删除,再对子表做统一处理。