广告位联系
返回顶部
分享到

order by + limit分页时数据重复问题及解决方法

Mysql 来源:互联网 作者:佚名 发布时间:2023-03-20 21:43:11 人浏览
摘要

问题描述:MYSQL version 5.6.8command 表结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 CREATE TABLE command ( ID INT NOT NULL, NAME VARCHAR(16), DESCRIPTION VARCHAR(32), INDEX idx_command_id (ID) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

问题描述:MYSQL version 5.6.8command 表结构

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

CREATE TABLE

 

command

 

(

 

ID INT NOT NULL,

 

NAME VARCHAR(16),

 

DESCRIPTION VARCHAR(32),

 

INDEX idx_command_id (ID)

 

)

 

ENGINE=InnoDB DEFAULT CHARSET=utf8;

表数据

order by + limit分页查询

查询第1页

1

select * from command order by age limit 0,4;

查询第2页

1

select * from command order by age limit 4,4;

可以看到第2页中查出了第1页中存在的重复数据

原因分析:

查看以上语句的执行计划

可以看到,order by limit时Mysql会进行优化,使用的是内存中的filesort文件排序,in memory filesort 使用的是优先级队列(priority queue),优先级队列使用的二叉堆;

使用 priority queue 的目的,就是在不能使用索引有序性的时候,如果要排序,并且使用了limit n,那么只需要在排序的过程中,保留n条记录即可这样虽然不能解决所有记录都需要排序的开销,但是只需要 sort buffer 少量的内存就可以完成排序。

因此,在limit n时,只会堆排序前n个,且是不稳定排序,因此并不能保证字段值相同时的相对顺序,因此分页时可能造成重复;

MySQL 5.5 没有这个优化,所以也就不会出现这个问题,5.6版本之后才出现了这种情况。

解决方案:

1. 新加一个排序字段,这个字段绝对有序,在第1个排序字段重复时, 使用第2个字段排序

2. 利用索引的有序性,如给id加上主键约束,排序字段添加索引

1

explain select id,age from command order by age limit 4,4

可以看到查询走了索引,排序就稳定了,没什么问题

(3)一些常见的数据库排序问题

不加order by的时候的排序问题
用户在使用Oracle或MySQL的时候,发现MySQL总是有序的,Oracle却很混乱,这个主要是因为Oracle是堆表,MySQL是索引聚簇表的原因。

所以没有order by的时候,数据库并不保证记录返回的顺序性,并且不保证每次返回都一致的。

分页问题

分页重复的问题

如前面所描述的,分页是在数据库提供的排序功能的基础上,衍生出来的应用需求,数据库并不保证分页的重复问题。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/t194978/article/details/129600846
相关文章
  • MySQL索引失效十种场景与优化方案介绍
    1 数据准备 1.1 新建数据表 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE `player` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键, `player_id` varchar(256) NOT NULL CO
  • order by + limit分页时数据重复问题及解决方法

    order by + limit分页时数据重复问题及解决方法
    问题描述:MYSQL version 5.6.8command 表结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 CREATE TABLE command ( ID INT NOT NULL, NAME VARCHAR(16), DESCRIPTION VARCHAR(32), INDE
  • 高版本Mysql使用group by分组报错的解决方案

    高版本Mysql使用group by分组报错的解决方案
    Mysql5.7版本以上对group by 分组有了新需求,要求group by 后的字段要与select后查询的字段一致,否则就会报错,报错信息如下: #1055 - Expressi
  • 在SQL中修改数据的基础语句
    什么是修改? 在SQL中的基本操作就是增删改查,查询语句不会对数据库中的数据进行修改。 而其余的三种操作都会对数据库进行修改,不管
  • MySQL字符串前缀索引使用

    MySQL字符串前缀索引使用
    1. 前缀索引与全部索引概念 怎么给字符串字段加索引?现在,几乎所有的系统都支持邮箱登录,如何在邮箱这样的字段上建立合理的索引,
  • MySql深分页问题解决
    1. 问题描述 日常开发中经常会涉及到数据查询分页的问题,一般情况下都是根据前端传入页数与页码通过mysql的limit方式实现分页,对于数据
  • MySQL之xtrabackup备份恢复的实现

    MySQL之xtrabackup备份恢复的实现
    mysql版本:8.0.28 xtrabackup版本:8.0.28 1、安装xtrabackup 下载地址:Download Percona XtraBackup 8.0https://www.percona.com/downloads 1 2 [root@myoracle ~]# tar -zxvf
  • Mysql的SELECT语句与显示表结构介绍

    Mysql的SELECT语句与显示表结构介绍
    SELECT... 1 2 SELECT 1+1, 2+2;# 直接这样写相当于下面这句 SELECT 1+1, 2+2 FROM DUAL; # 这里DUAL:伪表 SELECT ... FROM 语法: SELECT 标识选择哪些字段(列)
  • MySql如何不插入重复数据
    向数据库的插入值时,需要判断插入是否重复,然后插入。 这种操作怎么提高效率 下面说说一些解决方案 1、insert ignore into 当插入数据时,
  • MYSQL统计逗号分隔字段元素的个数
    写SQL的时候会遇到如下的问题,统计如下表中project_id字段中id的个数。 company_id project_id 77 94882,214880,94881,154882,94871,94879 140 2890,2872,3178,4314,
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计