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

  • 相关阅读:
    html调用js提示方法名 is not defined处理方法
    Amazon Redshift 基于 PostgreSQL 8.0.2
    Data Nodes
    AWS X-Ray
    API Gateway 中控制和管理对 REST API 的访问
    CodeBuild 与 Amazon Virtual Private Cloud 结合使用
    ElastiCache for Redis 缓存策略
    在 AWS X-Ray 控制台中配置采样规则
    什么是 Amazon Kinesis Data Analytics for SQL 应用程序?
    AWS Secrets Manager
  • 原文地址:https://www.cnblogs.com/yourstars/p/15701965.html
Copyright © 2011-2022 走看看