查看mysql索引mysql排序字段值相等时,分页数据重复
问题描述
在开发Edbox-⼤厅功能模块时,按照策划要求,需要⽀持作品数据分页,在与客户端联调过程中,客户端反应:第⼀页和第⼆页存在同⼀个作品。
原因分析
经查,服务端返回的分页后的数据中,第⼀页和第⼆页确实存在同⼀个作品,导致客户端显⽰两页作品存在重复的作品。
判断是排序出了问题,排序字段是createtime,查看数据库,发现有⼀部分作品的createtime值相等,因为是批刷的数据,导致创建时间⼀致。
⽽在MySQL 5.6以上版本,优化器在遇到order by limit语句的时候,做了⼀个优化,使⽤了priority queue,
使⽤ priority queue 的⽬的,就是在不能使⽤索引有序性的时候,如果要排序,并且使⽤了limit n,那么只需要在排序的过程中,保留n条记录即可,这样虽然不能解决所有记录都需要排序的开销,但是只需要 sort buffer 少量的内存就可以完成排序。
之所以出现了第⼆页数据重复的问题,是因为 priority queue 使⽤了堆排序的排序⽅法,⽽堆排序是⼀个不稳定的排序⽅法,也就是相同的值可能排序出来的结果和读出来的数据顺序不⼀致。
解决⽅案
索引排序字段,鉴于作品表的索引字段是⾃增长字段id,递增的数值也符合作品创建的先后概念,因此在排序时,增加id排序,在createtime 字段值相等情况下,⽤id进⾏⼆次排序,解决了该问题。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论