前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql - join 原理

Mysql - join 原理

作者头像
执生
发布2020-12-01 10:18:55
7650
发布2020-12-01 10:18:55
举报
文章被收录于专栏:立权的博客

A left join B , B right join A on A.x = B.y

  假设 A 100 行, B 1000 行

A 是驱动表,B是被驱动表

1.被驱动表上有索引的情况:(B.y 上有索引的情况)

  不用额外内存

  对 A 和 B 都从 硬盘中读,每读 A 一行(从主键索引上拿出 x,然后去硬盘通过 y 上索引的 B+ 树查找到对应的行),都会读 1 ~ N 行B

  读 A 的一行,然后和 这 1 ~ N 行结合 放到结果集(结果集是最后返回给用户的,不算临时表)

  具体只用 100 * k * log (1000) 次的磁盘读,k是不定常数

2.被驱动表上无索引的情况

  需要额外内存,被称为 join buffer

  join buffer 被放入驱动表,一般选用小的当驱动表(小的度量单位指的是 表行数 * 每行大小)

  对于被驱动表,从硬盘读出,并且每读出一行数据(先放在内存),就会取这行数据 对应的条件字段(B.y) 去和内存中的小表一行行比较

  把符合条件的驱动表的行 和 从磁盘中读出来的被驱动表的行 放入结果集

  具体要比较 100 * 1000 次,但是是内存操作

  磁盘读需要 100 + 1000 次

3.如果驱动表太大,join buffer 容不下,那么就要把 驱动表分批次读入内存

因为只有被读入的部分可以被 被驱动表比较,并且被比较的部分是被 整个被驱动表 比较

所以,如果驱动表被分成 K 份,就需要读取 被驱动表 K 次

总共需要磁盘 读取次数 = 驱动表行数 + 被驱动表行数 * (驱动表总大小 / join buffer大小)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档