前言:
在数据库中,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 语句的使用和弃用。尽量减少项目中相关查询的联接的使用。
版权声明:本文转载于网络,版权归作者所有。如有侵权,请联系本站编辑删除。