MYSQL数据库基础之Join操作原理

这篇文章主要给大家介绍了关于MYSQL数据库基础之Join操作原理的相关资料,连接(join)查询是将两个查询的结果以“横向对接”的方式合并起来的结果,需要的朋友可以参考下

join使用的是nested-loop join算法,nested-loop join有三种

?

1

2

select * from t1 join t2 on t1.a = t2.a;

— a 100条数据, b 1000条数据

simple nested-loop join

会遍历t1全表,t1作为驱动表,t1中的每一条数据都会到t2中做一次全表查询,该过程会比较100*1000次。

每次在t2中做全表查询时,全表扫描可就不保证在内存里了,buffer pool会淘汰,有可能在磁盘。

block nested-loop join(mysql驱动链接没有使用索引)

会遍历t1全表,将t1数据加载到join_buffer中,再遍历t2全表,让t2的每条数据去匹配join_buffer中t1缓存的数据。

t1全表扫描 = 100次

t2全表扫描 = 1000次

查询次数 = 1100次

join_buffer中比较 = 100 * 1000次

比较的次数和simple nested-loop join是一样的,但是比较的过程会比simple nested-loop join快很多,性能更好。

MYSQL数据库基础之Join操作原理

join_buffer是有大小的,如果t1查出来的数据是大于join_buffer大小的,则会先加载部分t1中的数据,比较完t2以后,清空join_buffer,再加载t1中剩余数据,加载不完全,再重复该操作。

t1全表扫描次数和join_buffer中比较1次数不变,但是t2的扫描次数会根据分段次数做一个乘法。

假设,驱动表的数据行数是 n,需要分 k 段才能完成算法流程,被驱动表的数据行数是 m。

k = λ * n

扫描被驱动表次数 = m * λ * n

MYSQL数据库基础之Join操作原理

λ是和join_buffer的大小有关的,join_buffer大小足够的情况下,大表驱动和小表驱动的时间是一样的。

需要分段的情况下,分段次数越少,被驱动表扫描的次数也会越少,所以应该采用小表驱动。

index nested-loop join(mysql驱动链接使用索引)

还是以上面的sql为例,如果a字段是有索引的。

t1表会扫描全表,t1表中每条数据会去t2表中做索引查询,查到id后再进行回表查询(如果连接字段是t2表的主键,回表操作将省略)。

t1扫描全表 = 100次

t2索引查询 = log1000次

t2回表查询 = log1000次

假设,驱动表的数据行数是 n,被驱动表的数据行数是 m。

总查询次数 = n + n * 2logm

由上可见,驱动表数据越大,查询的次数会越多,所以应该使用小表作为驱动表。

MYSQL数据库基础之Join操作原理

文章参考《mysql实战45讲–第34讲》

总结

到此这篇关于mysql数据库基础之join操作原理的文章就介绍到这了,更多相关mysql join原理内容请搜索钦钦技术栈以前的文章或继续浏览下面的相关文章希望大家以后多多支持钦钦技术栈!

原文链接:https://juejin.cn/post/6980316426892492837

版权声明:本文(即:原文链接:https://www.qin1qin.com/catagory/6502/)内容由互联网用户自发投稿贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630367839@qq.com 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022-07-28 12:12:51
下一篇 2022-07-28 12:13:04

软件定制开发公司

相关阅读

发表回复

登录后才能评论
通知:禁止投稿所有关于虚拟货币,币圈类相关文章,发现立即永久封锁账户ID!