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进行二次排序,解决了该问题。

  • 相关阅读:
    操作权限和数据权限
    maven scope
    maven dependencies与dependencyManagement的区别
    maven pom继承与聚合
    java @SuppressWarnings注解
    java使用省略号代替多参数(参数类型... 参数名)
    Bean Validation 技术规范特性概述
    synchronized锁住的是代码还是对象
    Java泛型
    Java的外部类为什么不能使用private、protected进行修饰
  • 原文地址:https://www.cnblogs.com/yourstars/p/15701965.html
Copyright © 2011-2022 走看看