• Mysql 45讲学习笔记(三十四)join


    一.Index Nested-LOOP JOIN

    select * from t1 straight_join t2 on (t1.a=t2.a);
    • 从表t1中读入一行数据R
    • 从数据行R中,取出a字段到表t2中寻找
    • 取出t2中满足条件的行,跟R组成一行,作为结果集的一部分

    join的执行流程

    1. 对驱动表t1做全表扫描,整个过程需要扫描100行
    2. 对每一行R,根据a字段去表t2查找,走的是树搜索过程

    分表查询的流程     

    • 执行sleelct * from t1,查出表t1的所有数据 
    • 循环遍历,去查询表2
    • 将结果返回成结果集

    二.选择驱动表

         join语句执行,驱动表是走全表扫描,被驱动表是走树搜索

    • 小表做驱动表
    • join语句性能比强拆多个单表执行SQL语句性能好

    三.Simple Nested-Loop Join

    1. select * from t1 straight_join t2 on (t1.a=t2.b);

    表t2字段b上没有索引,因此去查t2的时候要全表扫描

    笛卡尔积

    四.Block Nested-Loop Join

    •  将表t1数据读入线程内存 join_buffer 中
    • 扫描表t2,将表t2中的每一行 取出来,跟join_buffer中数据比对,满足join条件作为结果集的一部分返回

    五.能不能使用join语句

         

    • Index Nested-Loop Join 算法,被驱动表上有索引,可以使用(可以用join)   
    • Block Nested-Loop Join 算法,扫描行数过多,占用大量的系统资源(不要用join)   

    六.使用join----选择小表做驱动表

        两个表按各自条件过滤,过滤完成以后,计算join各自字段的总数量,数据量小的表叫小表,应该作为驱动表

    算法驱动表
    Index Nested-Loop Join 算法小表
    Block Nested-Loop Join 算法------join_buffer足够大一样
    Block Nested-Loop Join 算法------join_buffer分段小表

  • 相关阅读:
    [vite.js]按需加载自动注册组件
    【免费送书】蒙古包头旅游和美食推荐
    Go 微服务开发框架 DMicro 的设计思路
    1668. 最大重复子字符串
    盘点那些开发中经常用到的git命令
    Web开发 前端介绍 HTML CSS
    MySQL基础入门
    《Vue入门到精通系列之五》--- vue-router详解
    数据结构之反转链表
    Linux网络管理
  • 原文地址:https://blog.csdn.net/weixin_42369687/article/details/126293106