zoukankan      html  css  js  c++  java
  • Mysql

    A left join B , B right join A   on A.x = B.y

      假设 A 100 行, B 1000 行 

    A 是驱动表,B是被驱动表

    1.被驱动表上有索引的情况:(B.y 上有索引的情况)

      不用额外内存

      对 A 和 B 都从 硬盘中读,每读 A 一行(从主键索引上拿出 x,然后去硬盘通过 y 上索引的 B+ 树查找到对应的行),都会读 1 ~ N 行B

      读 A 的一行,然后和 这 1 ~ N 行结合 放到结果集(结果集是最后返回给用户的,不算临时表)

      具体只用 100 * k * log (1000) 次的磁盘读,k是不定常数

    2.被驱动表上无索引的情况

      需要额外内存,被称为 join buffer

      join buffer 被放入驱动表,一般选用小的当驱动表(小的度量单位指的是 表行数 * 每行大小)

      对于被驱动表,从硬盘读出,并且每读出一行数据(先放在内存),就会取这行数据 对应的条件字段(B.y) 去和内存中的小表一行行比较

      把符合条件的驱动表的行 和 从磁盘中读出来的被驱动表的行 放入结果集

      具体要比较 100 * 1000 次,但是是内存操作

      磁盘读需要 100 + 1000 次

    3.如果驱动表太大,join buffer 容不下,那么就要把 驱动表分批次读入内存

       因为只有被读入的部分可以被 被驱动表比较,并且被比较的部分是被 整个被驱动表 比较

      所以,如果驱动表被分成 K 份,就需要读取 被驱动表 K 次

       总共需要磁盘 读取次数 = 驱动表行数 + 被驱动表行数 * (驱动表总大小 / join buffer大小)

  • 相关阅读:
    ubuntu安装后做得几件事情 【robby_chan】
    malloc函数的一种简单的原理性实现[转]
    了解B树 B+树
    win下格式转为utf8 编码 转码
    log4j2与slf4j日志桥接
    java获取当前行数
    java获取服务器ip地址解决linux上为127.0.0.1的问题
    log4j2的基本使用
    navicator使用之mysql
    log4j与log4j2日志文件的操作
  • 原文地址:https://www.cnblogs.com/lqlqlq/p/14058663.html
Copyright © 2011-2022 走看看