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

  • 相关阅读:
    如何在iTerm2中配置oh my zsh?
    sublime中格式化jsx文件
    ES6 new syntax of Literal
    ES6 new syntax of Rest and Spread Operators
    How to preview html file in our browser at sublime text?
    ES6 new syntax of Default Function Parameters
    ES6 new syntax of Arrow Function
    七牛云2018春招笔试题
    Spring-使用注解开发(十二)
    Spring-声明式事物(十一)
  • 原文地址:https://www.cnblogs.com/yourstars/p/15701965.html
Copyright © 2011-2022 走看看