mysql关联表id_mysql join联表 + id自增
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自增相关推荐
- MySql的复习(五):联表查询和子查询
MySql的复习(五):联表查询和子查询 查询结果去重 关于查询结果的去重:distinct关键字 select distinct job from emp; // distinct关键字去除重复记录 ...
- 用php进行联查,Thinkphp使用join联表查询的方法
本篇文章介绍了Thinkphp使用join联表查询的方法,具有一定的参考价值,希望对各位学习thinkphp的朋友有帮助! Thinkphp使用join联表查询的方法 多表联查:$user = M(' ...
- php tp5的联表查询,Thinkphp使用join联表查询的方法
本篇文章介绍了Thinkphp使用join联表查询的方法,具有一定的参考价值,希望对各位学习thinkphp的朋友有帮助! Thinkphp使用join联表查询的方法 多表联查:$user = M(' ...
- 单表查询or联表查询
在实际开发中,我们不可避免的要关联几张数据表来合成最终的展示数据. 常见的做法一般有两种: a,联表查询 b,单表查询+业务层组装 联表查询 select *from sys_user uleft j ...
- 关于hive中Map join 时大表left join小表的问题
在hive中,(启用Map join时) 大表left join小表,加载从右向左,所以小表会加载进内存,存储成map键值对,通过大表驱动小表,来进行join,即大表中的join字段作为key 来获取 ...
- Spark广播变量之超大表left join小表时如何进行优化以及小表的正确位置
Spark广播变量之大表left join小表时如何进行优化以及小表的正确位置放置,带着这个目标我们一探究竟. 项目场景: 最近工作中遇到一个场景: 有一个超大表3.5T和一个小表963K 需要做关联 ...
- SparkSql MAPJOIN优化之小表left join大表
首先我们要了解MAPJOIN优化原理,这里简要说明下 Spark Broadcast hash join(Hive map join同理) 1,把小表广播到所有大表分布的节点上,在每个节点上分别进行单 ...
- mysql主动自增可以_Mysql join联表及id自增实例解析
join的写法 如果用left join 左边的表一定是驱动表吗?两个表的join包含多个条件的等值匹配,都要写道on还是只把一个写到on,其余写道where部分? createtablea(f1in ...
- MySql 你知道什么情况下适合使用Join 联表查询吗 ?
志在巅峰的攀登者,不会陶醉在沿途的某个脚印之中,在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的 ...
最新文章
- 用perl访问Oracle
- SpringSecurity分布式整合之验证认证的过滤器
- 表单提交报错405的解决方式
- java全局变量和局部变量_Java 10 –局部变量类型推断
- iOS-cocoapods使用方法
- C/C++根据特定字符分割字符串、读取文件去掉逗号等特定字符、strtok()函数详解
- oracle 2018 深圳大会,2018中国科幻大会深圳时间、地点、亮点
- tdk怎么设置_网站tdk如何正确的设置
- 一根绳子从一头烧需30时分钟_小学生一分钟跳绳满分训练指南
- Spring中的Bean配置
- python打开界面-python学习笔记(图形用户界面)
- Qt_Error QObject: Cannot create children for a parent that is in a different thread. 线程注意!!!
- 优化器 示意图 神经网络_走入五彩斑斓神经网络世界:关于梯度下降、RMSprop优化器的研究...
- 跨考计算机,一战398分成功上岸经验总结
- 华北电力大学控制与计算机工程学院怎么样,华北电力大学控制与计算机工程学院实践部10月25日动保劳动感想...
- Linux之Platform设备驱动
- HDU 4514 湫湫系列故事——设计风景线 (并查集)
- 同一个网段win10远程linux,Win10专业版系统在局域网内远程另外一台电脑教程
- 部署ChatGPT(在VPS或免费容器上),无需科学上网!
- 腾讯云上的个人网站建立
热门文章
- layui table 分页 序号始终从”1“开始解决方法
- 【报告分享】2019年中国95后洞察报告.pdf(附下载链接)
- 3-Scala控制结构
- LeetCode每日一题:14.longest-common-prefix(最长公共前缀)
- 吴恩达机器学习 9.机器学习系统设计
- 多目标跟踪(MOT)最新综述,一文快速入门
- 机器学习第一回——初识监督学习和无监督学习
- Java并发(三)——线程池
- java---解析XML文件,通过反射动态将XML内容封装到一个类中
- python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)