笛卡尔积:CROSS JOIN
内连接:INNER JOIN
左连接:LEFT JOIN
右连接:RIGHT JOIN
外连接:OUTER JOIN,MySQL不支持OUTER JOIN,但是我们可以对左连接和右连接的结果做UNION操作来实现
SELECT *
from sys_user_role b
left join sys_user a USING(user_id)
-- on a.user_id=b.user_id
Simple Nested-Loop Join(简单的嵌套循环连接)
Index Nested-Loop Join(索引嵌套循环连接)
Block Nested-Loop Join(缓存块嵌套循环连接)
永远用小结果集驱动大结果集(其本质就是减少外层循环的数据数量)
为匹配的条件增加索引(减少内层表的循环匹配次数)
增大join buffer size的大小(一次缓存的数据越多,那么内层包的扫表次数就越少)
减少不必要的字段查询(字段越少,join buffer 所缓存的数据就越多)
Show variables like 'optimizer_switc%';
Show variables like 'join_buffer_size%';
SHOW VARIABLES like 'datadir%'
InnoDB以页(page)为基本的IO单位,每个页的大小为16KB
InnoDB会为每个表创建用于存储数据的.ibd文件
这意味着我们有多少表要连接就需要读多少个文件,虽然可以利用索引,但还是免不了频繁的移动硬盘的磁头