一个数据表主键不是整型造成的bug

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

之前做一个项目,查询mysql性能较差,于是考虑将数据同步到es,改为查询es提高效率。
于是就有了从mysql到es同步数据的事,采用的思路是先查询出mysql数据表总数,然后分页同步到es。

同步完成后,发现有部分数据丢失,丢失的基本是比较近期的数据。

有一个情况是mysql表的数据是一直有一个定时任务在增加新数据,5分钟执行一次;表的主键不是整型,是字符串。这个问题造成了这个bug。

一、原因分析

定时任务5分钟执行一次,第一次全量同步的时候,采用分页查询同步,而数据量比较大,大约在30分钟到1个小时时间,5分钟没有执行完,下一次的定时任务又开始执行,数据库又同步了新数据,而分页还是按照之前的总数,造成数据缺失。
在这里插入图片描述
如果新数据是插入到数据库尾部,就不会影响到分页的情况,增量更新时就可以补充上。但是!

由于主键是字符串,字符串比较大小排序插入,字符串比较大小的规则是从第一个字符挨个比较,没有管长度,有可能主键的长度更长而第一个字符更小,所以插入有可能插入到了中间,造成尾部缺失。

二、解决方法

不以主键维度进行分页,最后选择一直会单向增长的字段,比如更新时间


总结

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值