[关闭]
@HUST-SuWB 2018-04-22T08:32:34.000000Z 字数 683 阅读 335

Mysql翻页的坑

Finlabtech


其实这是一个很小的问题。起因是某一天运营的伙伴突然反馈我说某系统的分页有问题,有一条数据总是重复出现,而且很容易复现。
我确认了下这个列表没什么特别之处。最开始我想说既然这条数据显示了两次那是不是有一条数据就没显示出来了,我跟数据库比对了一遍,发现列表显示的总条数是对的,然后确实有一条数据显示了两次而有另一条数据没显示出来。
我核对了几遍为啥这条数据这么特殊会显示不出来,毕竟这个系统已经运行好几个月了,这是第一次分页出问题。然后我就发现了一个问题,那就是在作为排序列的那个字段上,这两条数据的值是一样,所以开始怀疑是不是跟这个有关系。最后直接跑sql复现了这个问题。简述如下:

  1. 如果按某一列排序,然后翻页的节点刚好在这个排序列上的值相等,如A/B两条数据,在排序列上的值相等,然后刚好A是上一页最后一条,B是后面页的第一条,就可能会出现AB直接覆盖掉了,即A出现了两次,而B不见了。猜测是由于order by的时候上一页把A排在前面,所以显示了A,然后下一页呢又把B排在了前面, 觉得B已经读取过了,就又继续从A开始读(直接跑sql确认过,可以复现这个问题。在只使用一个排序列的情况下,如果有limit语句来实现分页效果,那么在分页那个节点上的数据如果排序列的值相同会出现错乱)。所以推荐再加一个order by id,这样可以保证即便第一个排序列值相等也可以用id来划分排序结果

后来我百度了一下,发现mysql的这个问题其实很多人在网上都提到过,而且也存在很久了。只怪自己学艺不精啊,不然也不会浪费这些时间去排查了。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注