Mysql sql语句不要过多使用 join

  1. inner join
    Mysql sql语句不要过多使用 join_第1张图片
    2.left join 左连接
    Mysql sql语句不要过多使用 join_第2张图片
    3.right join 右连接
    Mysql sql语句不要过多使用 join_第3张图片
    4.full join 全连接
    Mysql sql语句不要过多使用 join_第4张图片
    在执行join语句的时候必然要有一个比较的过程,逐条比较两个表的语句是比较慢的,因此我们可以把两个表中数据依次读进一个内存块中, 以MySQL的InnoDB引擎为例,使用以下语句我们必然可以查到相关的内存区域show variables like ‘%buffer%’
    Mysql sql语句不要过多使用 join_第5张图片
    如图所示join_buffer_size的大小将会影响我们join语句的执行性能。大部分数据库中的数据最终要保存到硬盘上,并且以文件的形式进行存储。
    以MySQL的InnoDB引擎为例:
    *InnoDB以页(page)为基本的IO单位,每个页的大小为16KB
    *InnoDB会为每个表创建用于存储数据的.ibd文件
    这意味着我们有多少表要连接就需要读多少个文件,虽然可以利用索引,但还是免不了频繁的移动硬盘的磁头,频繁的移动磁头会影响性能。
    Join算法
    Nested Loop Join
    Mysql sql语句不要过多使用 join_第6张图片
    嵌套循环,每次只读取表中的一行数据,也就是说如果outerTable有10万行数据, innerTable有100行数据,需要读取10000000次(假设这两个表的文件没有被操作系统给缓存到内存, 我们称之为冷数据表)
    Block nested loop
    Mysql sql语句不要过多使用 join_第7张图片
    Block 块,也就是说每次都会取一块数据到内存以减少I/O的开销
    当没有索引可以使用的时候,MySQL InnoDB 就会使用这种算法

你可能感兴趣的:(mysql,sql语句)