首页 > 自考资讯 > 高考百科

为什么大厂不建议使用多表join?,多表join执行过程

小条 2024-10-14

前言:

在数据库中,JOIN 是一种用于组合多个表中的数据的操作。通过JOIN操作,您可以根据表之间的关系合并相关数据,以方便更复杂的查询和分析。那么为什么不建议使用多表进行连接相关的查询呢?

分析

不建议连接查询的主要原因是连接效率相对较低。

MVSQL使用嵌套循环连接方法来实现相关查询。简单地说,我们使用两个循环层,使用第一个表作为外循环,第二个表作为内循环。每条记录如下所示:与内循环中的记录进行比较,输出满足条件的记录。

从算法实现来看,主要有三种类型:简单嵌套循环、块嵌套循环和索引嵌套循环。而且它的效率并不是很高。

MySQL 使用嵌套循环连接,当有两个表要连接时,其最大复杂度为O(n^2)。随着表的增长和表中数据量的增加,JOIN 的效率呈指数下降。

MySQL8.0中添加了PS:哈希连接算法。

扩展说明

MySQL 允许您使用JOIN 对两个或多个表执行联接查询。连接分为三种类型:内连接、左连接和右连接。

INNER JOIN(内连接,或等效连接):检索两个表中字段匹配关系的记录。获取两个表的交集。

LEFT JOIN : 即使右表中没有匹配的记录,也会检索左表中的所有记录。求两个表中的数据与左边的表的交集。

RIGHT JOIN : 与LEFTJOIN 相反,用于检索右表中的所有记录,即使左表中没有相应的匹配记录。获取两个表和右表数据的交集。

on关键字与join一起使用,指定相关查询的一些条件。

嵌套循环算法

MVSQL使用嵌套循环连接方法来实现相关查询。具体来说,主要有三种算法:简单嵌套循环连接、块嵌套循环连接和索引嵌套循环连接。

这三个都不是特别有效。

一个简单的嵌套循环。该方法简单粗暴。也就是说,复杂度可以认为是N*M,因为它涉及全扫描并连接两个表以成对比较数据。

N是驱动表的数量,M是驱动表的数量。

索引的嵌套循环。如果内循环表使用索引字段,则索引是B+树,所以复杂度可以近似为N*logM。块的嵌套循环实际上引入了一个缓冲区。缓冲区将外层循环的一些结果预先填充到JOIN BUFFER 中,然后将内层循环的每一行与整个缓冲区中的数据进行比较。比较次数仍然是N*M,但是连接缓冲区的效率要高得多,因为它是基于内存的。因此,尽管MySQL已经尽可能优化,但是这些算法的复杂度仍然很高,所以不建议在数据库内部使用多表JOIN。随着表数量的增加以及表中数据量的增加,JOIN的效率呈指数下降。

不能用join如何做关联查询

当我无法通过数据库进行相关查询时,如果需要查询多个表的数据怎么办?

主要有两种方法:

自己在记忆中进行关联。也就是说,首先检查数据库中的数据,然后在代码中运行第二个查询,然后执行关联。数据冗余是指将表中的一些重要数据进行冗余,以避免相关查询。宽表基于特定的联接关系,该连接关系将数据库中多个表的数据展平以创建大型宽表。这个可以同步到ES或者直接在数据库内查询。

总结

上面描述了SQL 语句中join 语句的使用和弃用。尽量减少项目中相关查询的联接的使用。

版权声明:本文转载于网络,版权归作者所有。如有侵权,请联系本站编辑删除。

猜你喜欢