zoukankan      html  css  js  c++  java
  • 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进行二次排序,解决了该问题。

  • 相关阅读:
    dtoi2680「SDOI2016」生成魔咒
    dtoi2679「SDOI2016」游戏
    dtoi2678「SDOI2016」数字配对
    dtoi2677「SDOI2016」储能表
    dtoi4545「HNOI2016」树
    dtoi4543「HNOI2016」最小公倍数
    dtoi4544「HNOI2016」网络
    dtoi4548「HNOI2016」大数
    ts定义数组对象
    RN项目ios本地模拟机无法加载本地图片的解决方案
  • 原文地址:https://www.cnblogs.com/yourstars/p/15701965.html
Copyright © 2011-2022 走看看