MySQL-Join
2020-01-14 本文已影响0人
花神子
SQL中的join可以根据某些条件把指定的表给结合起来并将数据返回给客户端
- inner join 内连接 只返回满足条件的数据
- left join 左连接 左外连接,只返回满足左表的数据【左表数据全部会显示
- right join 右连接 右外连接,只返回满足右表的数据【右表数据全部会显示】
- full join 全连接 返回左表和右表所有数据
如果需要使用join语句,如何优化提升性能?
分为两种情况,数据规模小的,数据规模大的。
- 数据规模较小 全部干进内存就完事了嗷
- 数据规模较大:可以通过增加索引来优化join语句的执行速度 可以通过冗余信息来减少join的次数 尽量减少表连接的次数,一个SQL语句表连接的次数不要超过5次.
join语句是相对比较耗费性能
执行join语句的时候必然要有一个比较的过程,
- 逐条比较两个表的语句是比较慢的,因此我们可以把两个表中数据依次读进一个内存块中, 以MySQL的InnoDB引擎为例,使用以下语句我们必然可以查到相关的内存区域show variables like '%buffer%'
- join_buffer_size的大小将会影响我们join语句的执行性能。
- 大部分数据库中的数据最终要保存到硬盘上,并且以文件的形式进行存储。以MySQL的InnoDB引擎为例,
(InnoDB以页(page)为基本的IO单位,每个页的大小为16KB,InnoDB会为每个表创建用于存储数据的.ibd文件)这意味着我们有多少表要连接就需要读多少个文件,虽然可以利用索引,但还是免不了频繁的移动硬盘的磁头,频繁的移动磁头会影响性能。
Linux 优化
Linux会把内存当作是硬盘的高速缓存(存储器层次结构的本质是,每一层存储设备都是较低一层设备的缓存)join也是使用
join_buffer来缓存数据:
join_buffer 你认为join_buffer里面存储的是什么?
在扫描过程中,数据库会选择一个表把他要返回以及需要进行和其他表进行比较的数据放进join_buffer
有索引的情况下是怎么处理的
- 直接读取两个表的索引树进行比较就完事了;
无索引情况处理 - 嵌套循环读取,但是每次读取Block 块,也就是说每次都会取一块数据到内存以减少I/O的开销,当没有索引可以使用的时候,MySQL InnoDB 就会使用这种算法。