Mysql sql语句不要过多使用 join
分类:
文章
•
2024-03-13 13:54:39
- inner join

2.left join 左连接

3.right join 右连接

4.full join 全连接

在执行join语句的时候必然要有一个比较的过程,逐条比较两个表的语句是比较慢的,因此我们可以把两个表中数据依次读进一个内存块中, 以MySQL的InnoDB引擎为例,使用以下语句我们必然可以查到相关的内存区域show variables like ‘%buffer%’

如图所示join_buffer_size的大小将会影响我们join语句的执行性能。大部分数据库中的数据最终要保存到硬盘上,并且以文件的形式进行存储。
以MySQL的InnoDB引擎为例:
*InnoDB以页(page)为基本的IO单位,每个页的大小为16KB
*InnoDB会为每个表创建用于存储数据的.ibd文件
这意味着我们有多少表要连接就需要读多少个文件,虽然可以利用索引,但还是免不了频繁的移动硬盘的磁头,频繁的移动磁头会影响性能。
Join算法
Nested Loop Join

嵌套循环,每次只读取表中的一行数据,也就是说如果outerTable有10万行数据, innerTable有100行数据,需要读取10000000次(假设这两个表的文件没有被操作系统给缓存到内存, 我们称之为冷数据表)
Block nested loop

Block 块,也就是说每次都会取一块数据到内存以减少I/O的开销
当没有索引可以使用的时候,MySQL InnoDB 就会使用这种算法