前言

线上推送业务的数据库出现连接数激增,同时出现推送内容丢失。综合两种情况,查询推送表发现自增id已经增加到21亿+。初步判断应该是自增id过多影响连接数,但是有多个问题不太理解(如自增id为什么不连续、int(11)会在多大数据时溢出、为什么溢出后会出现mysql连接数激增),所以写下这篇文章加深理解。

自增id为什么不是连续的

  1. 唯一键冲突
  2. 事务回滚
  3. 批量插入,分配自增id不连续
对于批量插入数据的语句,MySQL 有一个批量申请自增 id 的策略:
* 语句执行过程中,第一次申请自增 id,会分配 1 个;
* 1 个用完以后,这个语句第二次申请自增 id,会分配 2 个;
* 2 个用完以后,还是这个语句,第三次申请自增 id,会分配 4 个;
* 依此类推,同一个语句去申请自增 id,每次申请到的自增 id 个数都是上一次的两倍。
如果一次性批量插入4组数据,此时会申请7个自增id,多余的3个就浪费了,所以会出现不连续的情况。

int(11)会在多大数据时溢出

如果根据int(11),认为自增id超过99999999999才会溢出是有问题的。整数型和字符型不同,长度是固定的,也就是说int(1)和int(11)储存的最大值是一样的。数据的最大值只和类型有关(tinyint, int, bigint)和括号内的数字无关。各类型的最大长度如下

类型 字节数 范围
TINYINT 1 -128~127
SMALLINT 2 -32 768~32 767
MEDIUMINT 3 -8 388 608~8 388 607
INT 4 -2 147 483 648~2 147 483 647
BIGINT 8 -9 223 372 036 854 775 808~9 223 372 036 854 775 807

溢出后为什么会出现mysql连接数迅速增加

表定义的自增值达到上限后的逻辑是:再申请下一个 id 时,得到的值保持不变。那如果多个线程拿到多个相同的自增id去INSERT会怎么样呢?这里参考MySQL官方文档
例子如下:

-- table structure
CREATE TABLE t1 (i INT, PRIMARY KEY (i)) ENGINE = InnoDB;-- Session 1:
START TRANSACTION;
INSERT INTO t1 VALUES(1);-- Session 2:
START TRANSACTION;
INSERT INTO t1 VALUES(1);-- Session 3:
START TRANSACTION;
INSERT INTO t1 VALUES(1);-- Session 1:
ROLLBACK;

第1处,锁等待

session 1 执行的 insert 语句,发生唯一键冲突的时候,并不只是简单地报错返回,还在冲突的索引上加了锁(读锁)。session 2和session 3在记录上加写锁的时候回出现锁等待,直到session 1回滚。

第2处,死锁

session1拿到了exclusive锁(X锁),session2和session3发生duplicate-key错的时候,同时去请求shared锁。当session1回滚,它释放X锁,此时session2和session3同时获得shared锁(S锁),并同时去请求X锁。引起了死锁。我们看一下这个持有和竞争的关系:

S X
S 不冲突 冲突
x 冲突 冲突

因为X和S锁是互斥的,session2想要X锁,必须等待session3的S锁释放, session3想要获得X锁也要session2释放S锁,这个时候构成了环路等待,引起了死锁。

MySQL自增id溢出相关推荐

  1. mysql自动增长id 溢出_MySQL表自增id溢出的故障复盘怎么解决 MySQL表自增id溢出的故障复盘解决方法...

    MySQL表自增id溢出的故障复盘如何解决?本篇文章小编给大家分享一下MySQL表自增id溢出的故障复盘解决方法,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 问题:MyS ...

  2. 有关于mysql自增型需要返回id_关于mysql自增id,你需要知道的

    关于mysql自增id,你需要知道的,主键,重启,索引,类型,字段 关于mysql自增id,你需要知道的 易采站长站,站长之家为您整理了关于mysql自增id,你需要知道的的相关内容. 导读:在使用M ...

  3. 技术分享 | 关于 MySQL 自增 ID 的事儿

    作者:贲绍华 爱可生研发中心工程师,负责项目的需求与维护工作.其他身份:柯基铲屎官. 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源. 当我们使用 M ...

  4. 45 MySQL自增id

    45 MySQL自增id 表定义自增id 说到自增id,前面提到mysql的自增id不连续,当表定义的自增值达到上限后的逻辑是:再申请下一个id时,得到的值保持不变 create table t(id ...

  5. 修改 MySQL 自增ID的起始值

    修改 MySQL 自增ID的起始值 alter table users AUTO_INCREMENT=10000; posted on 2019-04-15 17:45 流易 阅读(...) 评论(. ...

  6. mysql自增id用完了_MySQL表自增id用完了该怎么办?

    我们知道MySQL表可以定义一个自增长的id,如果我们的表没有指定主键字段,那MySQL会给我们的表创建一个不可见的,长度为6个自己的row_id,然后不停地往上加步长,虽然生活中自然数是没有上限的, ...

  7. mysql自增id用完了_MySQL 自增 ID 用完了怎么办?

    MySQL 自增 ID 用完了怎么办? 在MySQL中有很多类型的自增ID,每个自增ID都设置了初始值,然后按照一定的步长增加,只要定义了字节长度,那么就会有上限,如果达到上限再次添加,则会报主键冲突 ...

  8. mysql自增id跳跃增长不连续,auto_increment_increment的问题

    问题: 发现测试服务器上mysql自增id不连续,以8的倍数跳跃,像这样8,16,24,32... 查找网上资料大多说的都是起始id不是从1开始,或者删除后再插入id不连续... 我的情况是,id不连 ...

  9. mysql id问题_关于MySQL自增ID的一些小问题总结

    下面这几个小问题都是基于 InnoDB 存储引擎的. 1. ID最大的记录删除后,新插入的记录ID是什么 例如当前表中有ID为1,2,3三条记录,把3删除,新插入记录的ID从哪儿开始? 答案: 从4开 ...

  10. mysql自增ID跳跃增长

    mysql自增ID跳跃增长 2018.06.12 16:09:36 字数 110 阅读 1253 #1.查看现在mysql自增id的配置 show variables like '%increment ...

最新文章

  1. 张亚勤2020寄语哥伦比亚大学毕业生:引领未知时代
  2. CentOS 7 安装harbor1.5.0
  3. vbs病毒分析神技——使用VS2017调试vbs脚本
  4. python的复数实部和虚部都是整数_Python(一)
  5. python做计量经济学的书籍_《计量经济学》教材书单
  6. abaqus实例手册_ABAQUS例子问题手册目录.pdf
  7. java上传图片裁剪_上传图像之裁剪
  8. Mysql用户与权限操作
  9. php生成白色背景图片
  10. 免费地图制作软件,在线做地图的平台推荐
  11. 工业大数据收集及预测建模方法(南京大学-宋哲博士分享)- 个人总结
  12. Oracle迁移到mysql字符集_oracle数据库字符集characterset迁移及变更系列一
  13. LoadRunner的函数全集
  14. C语言求最小公倍数和最大公约数三种算法(经典)----ACM
  15. 使用Mixamo_Converter重新定义根骨骼导入UE4
  16. Arduino中Serial.print()与Serial.write()函数的区别,以及串口通信中十六进制与字符串的收发格式问题和转换过程详解
  17. 一些适合程序员玩的游戏
  18. echarts-箱线图(盒须图)
  19. Pandas中replace替换问题
  20. 程序人生丨程序员必会的 10 种核心技能,全掌握你就是行业高手

热门文章

  1. HTTP headers 详解 headers 常用属性
  2. dw怎么保存HTML手机可以看,【dw网页制作】如何使用Dreamweaver制作网页?如何用Dreamweaver制作个人虚拟网站?dreamweaver如何制作手机网站?...
  3. 计算机局域网地址设置方法,怎么设置局域网电脑的ip地址和DNS?
  4. 【JIRA学习】 研发项目管理工具工时管理-插件Tempo
  5. WPS自动生成图片目录
  6. The7主题使用心得交流
  7. Python黑客绝技04:Python基础知识2
  8. 路由器密码破解:路由器登陆密码破解方法(仅用于丢失密码后
  9. Unity Shader-后处理:简单的颜色调整(亮度,饱和度,对比度)
  10. 21cn邮箱服务器端,21CN 免费邮箱常见问题