问题描述

在开发某功能模块时,按照策划要求,需要支持作品数据分页,在与客户端联调过程中,客户端反应:第一页和第二页存在同一个作品。

原因分析

经查,服务端返回的分页后的数据中,第一页和第二页确实存在同一个作品,导致客户端显示两页作品存在重复的作品。

判断是排序出了问题,排序字段是createtime,查看数据库,发现有一部分作品的createtime值相等,因为是批刷的数据,导致创建时间一致。

而在MySQL 5.6以上版本,优化器在遇到order by limit语句的时候,做了一个优化,使用了priority queue,

使用 priority queue 的目的,就是在不能使用索引有序性的时候,如果要排序,并且使用了limit n,那么只需要在排序的过程中,保留n条记录即可,这样虽然不能解决所有记录都需要排序的开销,但是只需要 sort buffer 少量的内存就可以完成排序。

之所以出现了第二页数据重复的问题,是因为 priority queue 使用了堆排序的排序方法,而堆排序是一个不稳定的排序方法,也就是相同的值可能排序出来的结果和读出来的数据顺序不一致。

 

解决方案

索引排序字段,鉴于作品表的索引字段是自增长字段id,递增的数值也符合作品创建的先后概念,因此在排序时,增加id排序,在createtime字段值相等情况下,用id进行二次排序,解决了该问题。

posted on 2021-12-17 13:45  Boom__Clap  阅读(770)  评论(0编辑  收藏  举报