相同问题:阿里巴巴规范手册为什么规定禁止超过三张表的join
如果使用JOIN语句,如何提升性能
(1)join关联中的字段增加索引,优化执行速度
(2)通过冗余字段来减少join次数
(3)尽量减少表连接的次数
原因
在执行join语句的时候必然会有一个比较的过程。两个表的关联,需要把两张表的数据依次读进同一块内存中,然后进行比较。
同时内存块的大小也会对查询速度造成影响。如果内存块大小不足以支撑两张表的数据,此时就需要频繁读取磁盘。读取磁盘的操作相对于读缓存来说是非常耗时的,因为查询过程是随机读取磁盘。
Innodb可通过命令
show variables like '%buffer%'
查看join_buffer_size的大小, join_buffer_size的大小会影响我们join语句的执行大小。
join_buffer 存储的是什么
在扫描过程中,数据库会选择一个表把它要返回的以及需要和其他数据表比较的数据放进join_buffer。
join关联的四种比较方式
(1)Netsted Loop Join
时间复杂度为O(n^2)
分别从两个表读一行数据进行两两对比。
(2)Block netsted Loop
时间复杂度为O(n^2)
分别从两个表读很多行数据,然后进行两两对比。
(3)index netsted loop join
使用到了索引。
时间复杂度为O(nlogn)
从第一个表读一行,然后在第二个表的索引中查找这个数据,因为索引是B+索引,会用到二分查找,
所以复杂度近似为nlogn。
(4) hash join
时间复杂度为O(n)
选择一张表(小表)建hash Table,第二个表在hash Table中查找匹配的项。
解决方案
(1)对相关表设置冗余字段
(2)多进行单表查询,并在代码层面上做关联操作
单表查询的好处
(1)缓存效率越高。查询的效率也会提升。
(2)将多表的查询分解后,可以减少锁竞争。
(3)在应用层做关联,可以更容易对数据库进行拆分,更容易做到高性能和可扩展。