浅谈mysql join底层原理


当前第2页 返回上一页

3、Block Nested-Loop Join ,join buffer缓冲区

如果有索引,会选取Index Nested-Loop Join进行连表,如果join列没有索引,就会采用Block Nested-Loop Join ,join buffer,在驱动表和非驱动表中间有个buffer的缓冲区,在查询时先将驱动表的数据缓存到buffer缓冲区内,然后批量与非驱动表进行匹配,这是一种将多次比较合并为一次比较的优化方案,注意:这里缓存的不只是关联表的列,select 后面的列也会缓存起来;

缓冲区大小

默认情况下buffer缓冲区join_biffer_size的容量为256k,如果说你的数据空间大于256k,就无法使用缓冲区了,转为最简单的循环嵌套Simple Nested-Loop Join,但是我们可以手动调整缓冲区大小来装入大容量的数据;查看join_biffer_size的sql:show variables like '%join_biffer_size%'

数据量大的表和数据量小的表如何选择连接顺序

最好由小表去连接大表,这样会减少扫描次数;比如大表有1000条数据,小表只有10条数据,那么最好的连接方式为:小表 join 大表;为什么要这么做呢?

  • 如果是大表 join 小表,假如我们的数据在大表的第999行,那么查询数据的时候就至少得扫描999次才能查出来;
  • 如果是小表 join 大表,假如我们的数据在小表的第9行,

细节

  • 连表查询的时候,最好不要超过三张表,因为需要join的字段,数据类型必须一致
  • 优先使用内连接来连表,外连接查询数据消耗的性能比内连接要高;
  • 确保关联查询中on 后面的列或者 using()中的字段带有索引,连表时可加快数据访问

到此这篇关于浅谈mysql join底层原理的文章就介绍到这了,更多相关mysql join底层原理内容请搜索

更多相关Mysql内容来自木庄网络博客


标签:Mysql

返回前面的内容

相关阅读 >>

mysql的基本命令介绍

详解mysql数据库中文乱码问题

mysql 8.0.14 安装配置方法图文教程(通用)

sql好学吗?

mac上mysql怎么卸载不了

mysql主键还需要建立索引吗?

装了navicat还要装mysql

详解用select命令在mysql执行查询操作的教程

mysql如何把日期转换为字符串类型

mysql基础架构教程之查询语句执行的流程详解

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...