你遇到过的测试难题(7)撑爆MySQL 数据库的 int 类型21亿

文章讨论了业务中遇到的数据库故障,源于大量用户数据更新失败,原因在于数据库自增值ID达到INT类型最大值,以及SQL语句的错误处理。作者强调了对数据库类型、用户量理解及故障排查的重要性。
摘要由CSDN通过智能技术生成

业务背景

目前有5百万用户,这些用户会定时更新一份数据到数据库里面,业务就是对用的数据分析,昨天数据,今天数据大概是这样子的用途

线上故障

突然发现有大量的用户数据,更新失败,或者是没有更新

故障结论

  1. 由于数据库的ID 使用使用自增值,到了 int 最大条数(21亿);
  2. SQL语句有使用忽略错误的语法,INSERT IGNORE INTO table_name (column1, column2, ...) VALUES (value1, value2, ...);
  3. 同时也有 mq有消息堆积

测试过程

测试环境和线上环境都运行了一段了时间,这段时间均为正常,数据有正常插入

总结

  1. 对数据库的类型要熟悉
  2. 对用户体量有了解
  3. 对故障错误定位排查

其实排查了很久,看异常的用户数据跟新到是哪一天的;

看业务逻辑是否有异常;

看日志记录;

看 SQL 去排查定位;

看 SQL的数据类型;

看 mq 消息;

INT数据类型

        在MySQL中,INT 数据类型的大小是固定的,不依赖于它的显示长度。INT 类型总是占用4个字节(32位),并且有一个范围从 -2,147,483,648 到 2,147,483,647

假设你每天插入五百万条数据(5,000,000条),并且使用无符号的 INT 作为自增ID,那么理论上,你可以插入的数据条数就是 从0到4,294,967,295

我们只需用无符号INT的最大值除以每天插入的数据条数。假设每天插入5,000,000条数据,那么理论上可以插入的天数就是:

4,294,967,295 / 5,000,000 ≈ 858.993459(约等于2年9个月)

这意味着,在不考虑其他因素(如数据删除、事务回滚、系统停机等)的情况下,理论上可以使用无符号INT作为自增ID插入数据约2年9个月的时间。

假设int自增从0开始

要计算多少天后 INT 会占满?

多少天后占满,2,147,483,647 / 5,000,000 = 429.4967294(大概1年2个月左右)

但需要注意的是,这里我们假设了每天插入的数据条数是固定的,实际上可能会有所波动。此外,还需要考虑其他因素,如事务回滚、数据删除等,这些都可能影响ID的使用情况。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值