• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
123456809 显示全部楼层 发表于 2021-8-13 14:11:14 |阅读模式 打印 上一主题 下一主题
Join利用的是Nested-Loop Join算法,Nested-Loop Join有三种
  1. select * from t1 join t2 on t1.a = t2.a;
  2. -- 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快许多,性能更好。

join_buffer是有巨细的,如果t1查出来的数据是大于join_buffer巨细的,则会先加载部门t1中的数据,比力完t2以后,清空join_buffer,再加载t1中剩余数据,加载不完全,再重复该操纵。
t1全表扫描次数和join_buffer中比力1次数稳固,但是t2的扫描次数会根据分段次数做一个乘法。
假设,驱动表的数据行数是 N,须要分 K 段才气完成算法流程,被驱动表的数据行数是 M。
K = λ * N
扫描被驱动表次数 = M * λ * N

λ是和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实战45讲--第34讲》
总结

到此这篇关于MYSQL数据库基础之Join操纵原理的文章就先容到这了,更多相关MYSQL Join原理内容请搜刮脚本之家从前的文章或继续欣赏下面的相关文章渴望大家以后多多支持脚本之家!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作