join的写法

如果用left join 左边的表一定是驱动表吗?两个表的join包含多个条件的等值匹配,都要写道on还是只把一个写到on,其余写道where部分?

createtablea(f1int,f2int,index(f1))engine=innodb;

2 createtableb(f1int,f2int)engine=innodb;

3 insertintoavalues(1,1),(2,2),(3,3),(4,4),(5,5),(6,6);

4 insertintobvalues(3,3),(4,4),(5,5),(6,6),(7,7),(8,8);

select*fromaleftjoinbon(a.f1=b.f1)and(a.f2=b.f2);/*Q1*/

2 select*fromaleftjoinbon(a.f1=b.f1)where(a.f2=b.f2);/*Q2*/

执行结果:

由于表b没有索引,使用的是Block Nexted Loop Join(BNL)算法

把表a的内容读入join_buffer中,因为select * ,所以字段f1,f2都被放入

顺序扫描b,对于每一行数据,判断join条件是否满足,满足条件的记录,作为结果集的一行,如果有where子句,判断where部分满足条件后再返回。

表b扫描完成后,对于没有匹配的表a的行,用null补上,放到结果集中。

Q2语句中,explain结果:

b为驱动表,如果一条语句EXTRA字段什么都没有的话,就是Index Nested_Loop Join算法,因此流程是:

顺序扫描b,每一行用b.f1到a中去查,匹配a.f2=b.f2是否满足,作为结果集返回。

Q1与Q2执行流程的差异是因为优化器基于Q2这个查询语义做了优化:在mysql里,null跟任何值执行等值判断和不等值判断的结果都是null,包括select null = null 也返回null。

在Q2中,where a.f2 = b.f2表示,查询结果里不会包含b.f2是null的行,这样left join语义就是找到两个表里f1 f2对应相同的行,如果a存在而b匹配不到,就放弃。因此优化器把这条语句的left join改写成了join,因为a的f1有索引,就把b作为驱动表,这样可以用NLJ算法,所以在使用left join时,左边的表不一定是驱动表。

如果需要left join的语义,就不能把被驱动表的字段放在where条件里做等值判断或不等值判断,必须写在on里面。

Nested Loop Join的性能问题

BLN算法的执行逻辑

将驱动表的数据全部读入join_buffer中,里面是无序数组。

顺序遍历被驱动表的所有行,每一行都跟join_buffer做匹配,成功则作为结果集的一部分返回。

Simple Nested Loop Join算法逻辑是:顺序去除驱动表的每一行数据,到被驱动表做全表匹配。

两者差异:

在对被驱动表做全表扫描时,如果数据没有在buffer pool中,需要等待部分数据从磁盘读入。会影响正常业务的buffer pool命中率,而且会对被驱动表做多次访问,更容易将这些数据页放到buffer pool头部。所以BNL算法性能会更好。

自增id

mysql中自增id定义了初始值,不停的增长,但是有上限,2^32-1,自增的id用完了会怎么样呢。

表定义的自增值达到上限后,再申请下一个id时,得到的值保持不变。再次插入时会报主键冲突错误。所以在建表时,如果有频繁的增删改时,就应该创建8个字节的bigint unsigned。

innodb 系统自增row_id

如果创建了Innodb表没有指定主键,那么innodb会创建一个不可见的,长度为6个字节的row_id,所有无主键的innodb表,每插入一行数据,都将当前的dict_sys.row_id值作为要插入数据的row_id,然后自增1。

实际上,代码实现时,row_id是一个长度为8字节的无符号长整形,但是innodb在设计时,给row_id只是6个字节的长度,这样写道数据时只放了最后6个字节。所以:

row_id写入表的范围是0到2^48-1;

当达到最大时,如果再有插入数据的行为来申请row_id,拿到以后再去最后6个字节就是0,然后继续循环。

再innodb的逻辑里,达到最大后循环,新数据会覆盖已经存在的数据。

从这个角度看,我们应该主动创建自增主键,这样达到上限后,插入数据会报错。数据的可靠性会更加有保障。

XID

redo log 和 binlog相互配合的时候,它们有一个共同的字段就是xid,在mysql中对应事务的。xid最大时2^64次方,用尽只存在理论。

thread_id

系统保存了全局变量thread_id_counter,每新建一个连接,就将thread_id_counter赋值给这个新连接的线程变量。thread_id_counter定义的大小是4个字节,因此到2^32-1就会重置为0,然后继续增加。但是show processlist里不会看到两个相同的thread_id,这是因为mysql设计了一个唯一数组逻辑,给新线程分配thread_id的时候:

do{

2 new_id=thread_id_counter++;

3 }while(!thread_ids.insert_unique(new_id).second);

mysql关联表id_mysql join联表 + id自增相关推荐

  1. MySql的复习(五):联表查询和子查询

    MySql的复习(五):联表查询和子查询 查询结果去重 关于查询结果的去重:distinct关键字 select distinct job from emp; // distinct关键字去除重复记录 ...

  2. 用php进行联查,Thinkphp使用join联表查询的方法

    本篇文章介绍了Thinkphp使用join联表查询的方法,具有一定的参考价值,希望对各位学习thinkphp的朋友有帮助! Thinkphp使用join联表查询的方法 多表联查:$user = M(' ...

  3. php tp5的联表查询,Thinkphp使用join联表查询的方法

    本篇文章介绍了Thinkphp使用join联表查询的方法,具有一定的参考价值,希望对各位学习thinkphp的朋友有帮助! Thinkphp使用join联表查询的方法 多表联查:$user = M(' ...

  4. 单表查询or联表查询

    在实际开发中,我们不可避免的要关联几张数据表来合成最终的展示数据. 常见的做法一般有两种: a,联表查询 b,单表查询+业务层组装 联表查询 select *from sys_user uleft j ...

  5. 关于hive中Map join 时大表left join小表的问题

    在hive中,(启用Map join时) 大表left join小表,加载从右向左,所以小表会加载进内存,存储成map键值对,通过大表驱动小表,来进行join,即大表中的join字段作为key 来获取 ...

  6. Spark广播变量之超大表left join小表时如何进行优化以及小表的正确位置

    Spark广播变量之大表left join小表时如何进行优化以及小表的正确位置放置,带着这个目标我们一探究竟. 项目场景: 最近工作中遇到一个场景: 有一个超大表3.5T和一个小表963K 需要做关联 ...

  7. SparkSql MAPJOIN优化之小表left join大表

    首先我们要了解MAPJOIN优化原理,这里简要说明下 Spark Broadcast hash join(Hive map join同理) 1,把小表广播到所有大表分布的节点上,在每个节点上分别进行单 ...

  8. mysql主动自增可以_Mysql join联表及id自增实例解析

    join的写法 如果用left join 左边的表一定是驱动表吗?两个表的join包含多个条件的等值匹配,都要写道on还是只把一个写到on,其余写道where部分? createtablea(f1in ...

  9. MySql 你知道什么情况下适合使用Join 联表查询吗 ?

    志在巅峰的攀登者,不会陶醉在沿途的某个脚印之中,在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的 ...

最新文章

  1. 用perl访问Oracle
  2. SpringSecurity分布式整合之验证认证的过滤器
  3. 表单提交报错405的解决方式
  4. java全局变量和局部变量_Java 10 –局部变量类型推断
  5. iOS-cocoapods使用方法
  6. C/C++根据特定字符分割字符串、读取文件去掉逗号等特定字符、strtok()函数详解
  7. oracle 2018 深圳大会,2018中国科幻大会深圳时间、地点、亮点
  8. tdk怎么设置_网站tdk如何正确的设置
  9. 一根绳子从一头烧需30时分钟_小学生一分钟跳绳满分训练指南
  10. Spring中的Bean配置
  11. python打开界面-python学习笔记(图形用户界面)
  12. Qt_Error QObject: Cannot create children for a parent that is in a different thread. 线程注意!!!
  13. 优化器 示意图 神经网络_走入五彩斑斓神经网络世界:关于梯度下降、RMSprop优化器的研究...
  14. 跨考计算机,一战398分成功上岸经验总结
  15. 华北电力大学控制与计算机工程学院怎么样,华北电力大学控制与计算机工程学院实践部10月25日动保劳动感想...
  16. Linux之Platform设备驱动
  17. HDU 4514 湫湫系列故事——设计风景线 (并查集)
  18. 同一个网段win10远程linux,Win10专业版系统在局域网内远程另外一台电脑教程
  19. 部署ChatGPT(在VPS或免费容器上),无需科学上网!
  20. 腾讯云上的个人网站建立

热门文章

  1. layui table 分页 序号始终从”1“开始解决方法
  2. 【报告分享】2019年中国95后洞察报告.pdf(附下载链接)
  3. 3-Scala控制结构
  4. LeetCode每日一题:14.longest-common-prefix(最长公共前缀)
  5. 吴恩达机器学习 9.机器学习系统设计
  6. 多目标跟踪(MOT)最新综述,一文快速入门
  7. 机器学习第一回——初识监督学习和无监督学习
  8. Java并发(三)——线程池
  9. java---解析XML文件,通过反射动态将XML内容封装到一个类中
  10. python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)