• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    MySQL InnoDB row_id边界溢出验证的方法步骤

    背景

    跟同学聊到row_id一个边界问题,这里详细说明下。

    InnoDB表若没有定义主键,会使用系统的一个默认递增row_id (dict_sys->row_id)作为主键。每次插入一行加1,到达最大值循环复用。

    需要注意的是,虽然dict_sys->row_id 被定义为一个unsigned long long, 但由于这个主键值只有6个字节,因此最大值是2^48。 row_id超过这个值还是会递增,只是写入的时候只取低位,可以认为是做取模操作。

    问题

    这就涉及到一个问题,一个长期运行的MySQL里,如果频繁插入删除行(像日志类的表),即使最终表规模不是很大,仍可能会出现值row_id重用。而我们知道作为主键值,是不能重复的。

    假设出现这种情况,在一个表里,新插入的一行的row_id与某一个年代久远的行的row_id出现冲突,会肿么样?

    验证

    其实本来这里只需要一个结论。本文的目的还是跟大家探讨一种验证的方法。有了上面的信息,我们可以考虑设计如下的复现步骤:

    1)    创建一张无主键空表

    2)   gdb设置dict_sys->row_id为1

    3)  往空表插入若干行

    4)   gdb设置dict_sys->row_id为2^48

    5)   再插入若干行

    6)   看结果

    结论

    可以看到,行(1),(2)被覆盖了。

    比较合理点的方案应该是像MySQL的表内自增主键一样,报个duplicate-key error.

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。

    您可能感兴趣的文章:
    • Mysql InnoDB和MyISAM区别原理解析
    • 获取 MySQL innodb B+tree 的高度的方法
    • MySQL MyISAM 与InnoDB 的区别
    • 简述MySQL InnoDB存储引擎
    • MySQL Innodb 存储结构 和 存储Null值 用法详解
    • MySQL InnoDB如何保证事务特性示例详解
    • MySQL启动报错问题InnoDB:Unable to lock/ibdata1 error
    • MySQL InnoDB中的锁机制深入讲解
    • 详解MySQL(InnoDB)是如何处理死锁的
    • MySQL学习(七):Innodb存储引擎索引的实现原理详解
    • MySQL slow_log表无法修改成innodb引擎详解
    • mysql innodb的重要组件汇总
    上一篇:MySQL中主键与rowid的使用陷阱总结
    下一篇:详解Mysql5.7自带的压力测试命令mysqlslap及使用语法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    MySQL InnoDB row_id边界溢出验证的方法步骤 MySQL,InnoDB,row,边界,溢出,