【MySQL】 SQL 执行顺序 OR 递增id用完了怎么办呢?哪个问题难回答

这里写目录标题

  • 写在前面
  • 基础概念
  • SQL 执行顺序
    • FROM
    • ON
    • JOIN
    • WHERE
    • GROUP BY
    • HAVING
    • SELECT
    • DISTINCT
    • ORDER BY
  • Mysql 自增 ID用完了
    • 1.有主键的情况
      • 解决方案
    • 2.没有主键
      • 解决方案:
  • 总结

写在前面

三月已经结束了,不知道这个月你有没有被邀请面试,如果有面试的过程中有没有被问到MySQL的执行顺序是怎样的啊,如果MySQL中递增id用完了怎么处理的呢?先自己思考一下会不会跟面试官回答清楚,如果会的话,给自己点个赞,总结一下。
也可继续看这篇文章加深一下印象,评论区分享下自己的心得。

基础概念

在说这个 SQL 的执行顺序之前,还有几个知识点需要提一下。
笛卡尔积:两个集合相乘,得到的结果包含了两个集合中元素之和。

永久表:普通意义上自行创建的表,用于长期保存数据等操作。

临时表:分为两种,其一是为了保存数据,也可以长期存在于数据库中;其二是因为 SQL 执行中临时创建的,在 SQL 执行结束后,就会被删除。

虚表:虚表类似于一个结果集,也可以说成是一个视图,只是个执行结果。

SQL 执行顺序

假设一条查询语句是这样的:

select  返回的字段   from 表和关联表  where  查询条件

FROM

首先解析 From 两边的表,进行笛卡尔积的计算,产生一个虚表 table1。

ON

接着通过 ON 条件来进行筛选,形成第二个虚表 table2,最新的数据也在这里面。

JOIN

根据内连接和外连接的不同,这里也会有所不同,内连接会增加外部行,左连接会将 ON 过滤条件的左表添加进去,右连接会将 ON 过滤条件的右表添加进去,生成虚表 table3。

WHERE

接着就是执行 where 过滤,通过 where 条件的过滤形成虚表 table4。

GROUP BY

如果 SQL 语句中存在 group by,则会对虚表 table4 进行分组,产生出虚表 table5,紧接着会执行聚合函数。

HAVING

Group by 执行完毕,会继续执行 having 过滤,从而生成虚表 table6

SELECT

执行完上述语句后,就会执行 select 语句了,将虚表 table6 中的列,针对 select 进行筛选,随后生成出虚表 table7

DISTINCT

select 语句执行完毕后,就会去执行去重操作了,这里同样会生成新的虚表 table8

ORDER BY

执行完上述操作后,就该执行排序了,在排序之后还会执行 limit 操作。

到这里就是MySQL中常见的sql执行顺序了,你学会了不?

Mysql 自增 ID用完了

Mysql 自增 ID 上限的问题,可以分为两个方面来说。

1.有主键的情况

如果设置了主键,并且一般会把主键设置成自增,Mysql 里 int 类型是 4 个字节,如果有符号位的话就是[-231,231-1],无符号位的话最大值就是 2^32-1,也就是 4294967295。

创建一张表试试:

	CREATETABLE`test`(
	`id`int(11)NOTNULLAUTO_INCREMENT,
	`name`varchar(32)NOTNULLDEFAULT'',
	PRIMARYKEY(`id`)
	)ENGINE=InnoDBAUTO_INCREMENT=2147483647DEFAULTCHARSET=utf8mb4;

然后执行插入

insertintotest1(name)values('qq');

这样表里就有一条达到有符号位的最大值上限的数据。

如果再次执行插入语句:

insertintotest(name)values('ww');

就会看到错误提示:

1062 - Duplicate entry ‘2147483647’ for key ‘PRIMARY’, Time: 0.000000s。

也就是说,如果设置了主键并且自增的话,达到自增主键上限就会报错重复的主键 key。

解决方案

mysql 主键改为 bigint,也就是 8 个字节。
设计的时候要考虑清楚值的上限是多少,如果业务频繁插入的话,21 亿的数字其实还是有可能达到的。

2.没有主键

如果没有设置主键的话,InnoDB 则会自动帮你创建一个 6 个字节的 row_id,由于 row_id 是无符号的,所以最大长度是 2^48-1。

同样创建一张表作为测试:

CREATETABLE`test2`(
`name`varchar(32)NOTNULLDEFAULT''
)ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;

通过ps -ef|grep mysql拿到 mysql 的进程 ID,然后执行命令,通过 gdb 先把 row_id 修改为 1

sudogdb-p2584-ex'pdict_sys->row_id=1'-batch

然后插入几条数据:

insertintotest2(name)values('1');
insertintotest2(name)values('2');
insertintotest2(name)values('3');

再次修改 row_id 为 2^48,也就是 281474976710656

sudogdb-p2584-ex’pdict_sys->row_id=281474976710656’-batch
再次插入数据

insertintotest2(name)values('4');
insertintotest2(name)values('5');
insertintotest2(name)values('6');

然后查询数据会发现 3 条数据是 4,5,6,3。

因为我们先设置 row_id=1 开始,所以 1,2,3 的 row_id 也是 1,2,3。

修改 row_id 为上限值之后,row_id 会从 0 重新开始计算,所以 4,5,6 的 row_id 就是 0,1,2。

由于 1,2 数据已经存在,数据则是会被覆盖。

自增 ID 达到上限用完了之后,分为两种情况:

如果设置了主键,那么将会报错主键冲突。
如果没有设置主键,数据库则会帮我们自动生成一个全局的 row_id,新数据会覆盖老数据

解决方案:

表尽可能都要设置主键,主键尽量使用 bigint 类型,21 亿的上限还是有可能达到的,比如魔兽,虽然说 row_id 上限高达 281 万亿,但是覆盖数据显然是不可接受的。

总结

不管在任何时候出去面试的时候遇到问题都不要慌,要有信心,要相信自己可以取得offer的。
四月加油,期待可以点个免费的三连和关注哦。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/5502.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++笔试强训】第二天

选择题 解析:考查printf,%后面-表示输出左对齐,输出左对齐30个字符格式为%-30f,.后面表示精度。%e字符以指数形势输出,可以认为是double类型(也就是小数点后保留6位)的指数。为%f字符表示输出格…

JVM问题(二) -- 内存泄漏

1. 什么是内存泄漏: 2. 内存泄漏的理解: 严格来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏。 但是实际情况很多时候一些不太好的实践(或疏忽)会导致对象的生命周…

2023年3月华为HCIA认证新增题库(H12-811)

850、 SNMP报文是通过 TCP来承载的。 A、对 B、错 试题答案:[["B"]] 试题解析: 851、 Trunk端口可以允许多个 VLAN通过,包括 VLAN4096。 A、对 B、错 试题答案:[["B"]] 试题解析: 852、 RADIUS是实…

【websocket消息推送】前端+后端实现websocket消息推送的整个生命周期(附源码详解)

【写在前面】写这篇文章的原因主要还是博主在工作的过程中遇到了一个困难,就是客户端开了两个一模一样的窗口(A和B),然后A窗口触发一个请求,请求后是推送到前端的,但是推送的消息只推给了B,而A没…

【C++笔试强训】第三天

选择题 解析:字符数组里面的最后一个字符是0,说明里面本身就是一个字符串——"123456789",数组名表示数组首元素的地址,那么p a i指向的就是字符数组中元素9,那么p - 3就是指向元素6的地址,%s打…

在VScode中配置Python开发环境----需要注意的一个点:settings.json

在VScode中配置Python开发环境(可以参考这个博主的方法): http://t.csdn.cn/L1jux 1、安装python 官网下载地址:https://www.python.org/ftp/python/3.8.0/python-3.8.0-amd64.exe 双击打开.exe文件 勾选 Add Python 3.8 to Pat…

【计算机视觉 | 目标检测】DETR风格的目标检测框架解读

文章目录一、前言二、理解2.1 DETR的理解2.2 DETR的细致理解2.2.1 Backbone2.2.2 Transformer encoder2.2.3 Transformer decoder2.2.4 Prediction feed-forward networks (FFNs)2.2.5 Auxiliary decoding losses2.3 更具体的结构2.4 编码器的原理和作用2.5 解码器的原理和作用…

刚刚,Frontiers in Psychology 取消on hold状态,但这本期刊仍在评估中

3月28日时,Frontiers in Psychology仍处于on hold状态。 就在刚刚!小编查询Frontiers in Psychology时,发现Master Journal List中,期刊Frontiers in Psychology的on hold标识没有了,这表示期刊目前正被SSCI数据库收录…

独立部署基于apiKey或accessToken的GPT聊天工具

最近chat-GPT的强大功能让人新潮澎湃,大家都在讨论,都想尝试一下。。。 奈何用不了!自己整整,内附具体步骤,如何用手机验证码注册,如何自己搭一个前端,nodejs后端,可以访问自己的GTP。 先上图: 自己搭的: 官网: 步骤一、用个代理 因为没这个无法访问GPT官网 忍…

类与对象,对象在内存的存在形式,java方法

类是抽象的,概念的,代表一类事物,比如人类,猫类..即它是数据类型对象是具体的实际的,代表一个具体事物,即实例。类是对象的模板,对象是类的一个个体,对应一个实例 public class Targ…

Jenkins入门

Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具 持续集成(CI)是在源代码变更后自动检测、拉取、构建和(在大多数情况下)进行单元测试的过程 可以简单将jenkins理解为一个代码部署工具。 在没有持续部署工具之前&#x…

【Redis进阶】Redis数据结构

文章目录1. 前言2. SDS2. 链表3. 压缩链表4. 哈希表5. 整数集合6. 跳表7. quicklist8. listpack1. 前言 Redis常用的数据结构为String,List,Hash,Set,Sorted Set。但这只是我们在用的时候键值对的表现形式,他们底层真…

《程序员面试金典(第6版)》面试题 08.05. 递归乘法

题目描述 递归乘法。 写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。 示例1: 输入:A 1, B 10 输出:10 示例2: 输入:A 3, B 4 输出:…

vue3使用useMouseInElement实现图片局部放大预览效果

1、首先要安装vueuse/core npm i vueuse/core2、实现过程如下&#xff1a; <template><div class"goods-image"><!-- 大图 --><div v-show"show" class"large" :style"[{backgroundImage:url(${images[currIndex]})…

Cursor,程序员的 AI 代码编辑助手

相信大家都或多或少地听说过、了解过 chatGPT &#xff0c;半个月前发布的 GPT-4 &#xff0c;可谓是 AI 赛道上的一个王炸 那么今天咸鱼给大家分享一个开源的 AI 代码编辑器——Cursor&#xff0c;让各位程序员在编程之路上一骑绝尘 &#x1f603; 介绍 Cursor 是一个人工智…

深度学习应用技巧4-模型融合:投票法、加权平均法、集成模型法

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下&#xff0c;深度学习中的模型融合。它是将多个深度学习模型或其预测结果结合起来&#xff0c;以提高模型整体性能的一种技术。 深度学习中的模型融合技术&#xff0c;也叫做集成学习&#xff0c;是指同时使用多个…

209. 长度最小的子数组

209. 长度最小的子数组 力扣题目链接(opens new window) 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0。 示例&#xff1a; 输入…

Java实现查找文件

1 问题 如何利用java来查找文件&#xff1f; 2 方法 2.1定义一个查找类&#xff0c;设置两个参数&#xff08;查找的目录和文件后缀名&#xff09;&#xff0c;然后判断文件夹是否为空 2.2 判断是否是文件夹&#xff0c;如果是文件夹则将里面的文件放入数组进行遍历&#xff08…

【Python零基础学习入门篇①】——基本语法与变量

⬇️⬇️⬇️⬇️⬇️⬇️ ⭐⭐⭐Hello&#xff0c;大家好呀我是陈童学&#xff0c;一个普通大一在校生&#xff0c;请大家多多关照呀嘿嘿&#x1f601;&#x1f60a;&#x1f618; &#x1f31f;&#x1f31f;&#x1f31f;技术这条路固然很艰辛&#xff0c;但既已选择&#x…

Redis 事务相关操作

Redis 作为一个非关系型内存数据库&#xff0c;也有事务定义 1. 事务的定义-ACID特性 A表示原子性&#xff1a;即事务是一个不可分割的实体&#xff0c;事务中的操作要么都完成&#xff0c;要么都不完成 C表示一致性&#xff1a;即事务前后数据完整性必须一致&#xff0c;假…