标签: Mysql

Mysql临时表CREATE TEMPORARY TABLE

群友的一个小问题,大意如下。我手中目前已知有若干ID列表,如[1,2,3,4,5]的ID,需要到某张表中查询出表中不存在的ID。

好像有点绕,实际列举数据说明下,比如此刻表中有ID为[2,4,5,6,7]的数据,那么最终查询出来的结果应当为[1,3],因为[1,3]在我们已知的列表[1,2,3,4,5]中,但是不在数据库的表[2,4,5,6,7]中,而[6,7]因为不在[1,2,3,4,5]中,所以也不符合要求。

其实这个问题很好解的,最直观的来说我们先拿[1,2,3,4,5],到表中查询[2,4,5,6,7]用in语句得到[2,4,5]的结果,之后再拿[1,2,3,4,5]到[2,4,5]的结果集中用not in语句就可以得到[1,3]。

但,问题不是这里,而是[1,2,3,4,5]不是一个结果集,而是入参,所以我们这里我们需要用到MYSQL的临时表。而如果[1,2,3,4,5]是在一张表里的结果的话,那么我们就可以换另一个思路了,用临时表[1,2,3,4,5]LEFT JOIN目标表使用id关联,并保留当前的[1,2,3,4,5]的列和目标表的ID列,关联后的结果如果目标ID列为空的数据可以再做一次过滤剔除。

Continue reading

一次Mysql使用order by和limit分页查询的陈年旧坑

  • 起因背景

本次开发是在一个旧功能的增加新的逻辑,其中有这么一个消息重发的模块。在正常的Kafka消息推送过程中,因为异常、数据条件暂时无法确定是否能够下发的情况下,把这条消息暂时存到一张Mysql表中,并使用定时任务每隔一段时间扫一下这张表,把消息重新尝试下发Kafka。如果发送失败,则把这条消息的重试次数加1。如果发送成功,则把这条消息的从重试表中删除。

  • 问题现象

因为这是一个上线了几年的功能了,且这次开发的需求是在下发的时候进行的调整,所以一开始对这块并没有太多在意。直到昨天测试同学给我讲了他发现的一个现象,执行一次重试任务之后,有些数据的重试次数加了不止1次,但是有些数据的重试次数却没有增加。那么疑点就来了,根据测试提供的充实任务入口名称,我找到了这段已经在生产环境跑了好几年的代码,初步看了一遍基本定位到问题所在。

基本逻辑是这样的

  1. 根据分页参数分页从Mysql捞取待重试数据,需要查询已重试次数小于一个设定值的,比如5次
  2. 将待重试数据调用推送Kafka方法尝试进行推送,这之中包括一系列验证逻辑
  3. 推送成功的数据从表中清除
  4. 推送失败的数据在表中更新重试次数加1
Continue reading