点赞再看,养成习惯,大家好,我是辰兮!今天介绍怎么解决主键ID跳跃增长问题。
开场白
作为程序员的二狗子今天已经把手下的任务做完了,正在假装认真工作的样子尽情摸鱼,二狗子闲得无聊,坐立不安,坐着不是,站着也不是,浑身难受。
老板:“那个.....二狗子,你过来一趟”
二狗子心想,老司机摸鱼被发现啦?怀着忐忑不安的心情去了老板那里。
老板:“这张表主键ID设置的自动增长为什么会跳跃增长,而且增长的速度非常快,再这样下去迟早有一天会突破Int的最高数值,你赶紧想办法解决一下!”
二狗子悬着的心放了下来,心想,还好没抓到我摸鱼,我就说作为老司机的我怎么可能被发现呢
此后,二狗子开始了寻找BUG之路。。。。
一、思路
首先要知道为什么会出现这个问题
二狗子想了想,自测insert几条数据之后发现,问题就在每次执行UPDATE语句后,主键ID也会自动+1,但是按照需求来说执行修改操作主键ID不需要自动+1,不然就会出现主键ID跳跃增长的BUG。
在知道问题之后,最终把问题定位到了ON DUPLICATE KEY UPDATE
二、如何解决
一般解决问题有很多种方案,这里从三个方面来介绍解决方案
1、从项目代码逻辑出发
可以改变代码逻辑,变成先执行update方法,然后判断返回值是否等于0,如果返回值等于0则证明没有数据变动,否则执行insert方法。
这样可以解决问题,但是从之前的一次sql变为了两次,会导致效率低下,需要考虑项目大小来选择解决方案。
2、从问题出发:ON DUPLICATE key update会在update时主键也会自增+1
这样可以在insert之前增加一条sql语句(需要在配置中支持多条sql语句执行):
默认为false,这里需要改为true
设置完之后就可以解决ON DUPLICATE key update会在update时主键也会自增+1这个问题了,但是这样每次在执行这个sql时都会调用alter table wss_production_model auto_increment=1,这样会导致效率会变低,需要看项目大小来确定解决方案。
3、从Mysql配置出发
修改innodb_autoinc_lock_mode配置
innodb_autoinc_lock_mode中有3种模式, 0、1、2,mysql默认为1,
- 0:每次分配自增id的时候都会锁表,这个对并发不太支持
- 1:只有在bulk insert的时候才会锁表,简单insert的时候只会使用一个light-weight mutex,比0的并发性能高
- 2:很多不保证,不太安全,不建议使用
修改为0则可以解决问题,然而修改完后会导致在高并发下发生问题,而且线上数据库和本地数据库的配置要同步,这里不推荐使用这种方法。
总结
解决此方案有三种方案:
- 从项目代码逻辑出发
- 从问题出发
- 从配置出发
具体解决方案可以根据项目来选择,如果项目不大,可以考虑1和2。如果不考虑高并发问题,可以考虑3。
我是辰兮,你知道的越多,你不知道的越多,我们下期见!
人才们的 【三连】 就是辰兮创作的最大动力,如果本篇博客有任何错误和建议,欢迎人才们留言!