服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - order by + limit分页时数据重复问题及解决方法

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

2023-03-19 17:30如来神掌十八式 Mysql

这篇文章主要介绍了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),
 
INDEX idx_command_id (ID)
 
)
 
ENGINE=InnoDB DEFAULT CHARSET=utf8;

表数据

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

order by + limit分页查询

查询第1页

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

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

查询第2页

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

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

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

原因分析:

查看以上语句的执行计划

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

可以看到,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

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

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

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

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

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

分页问题

分页重复的问题

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

到此这篇关于order by + limit分页时数据重复的文章就介绍到这了,更多相关order by  limit分页时数据重复内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/t194978/article/details/129600846

延伸 · 阅读

精彩推荐
  • MysqlMySQL三大日志(binlog、redo log和undo log)图文详解

    MySQL三大日志(binlog、redo log和undo log)图文详解

    日志是MySQL数据库的重要组成部分,记录着数据库运行期间各种状态信息,下面这篇文章主要给大家介绍了关于MySQL三大日志(binlog、redo log和undo log)的相关资料...

    世界尽头与你24212023-02-28
  • MysqlMySQL数据库主从同步实战过程详解

    MySQL数据库主从同步实战过程详解

    这篇文章主要介绍了MySQL数据库主从同步,结合实例形式详细分析了MySQL数据库主从同步基本配置方法与操作注意事项,需要的朋友可以参考下...

    民工哥5502021-01-16
  • Mysql分享MySql8.0.19 安装采坑记录

    分享MySql8.0.19 安装采坑记录

    这篇文章主要介绍了MySql8.0.19 安装采坑记录,内容虽然不长,但是都是朋友经常遇到的问题,小编特此分享到脚本之家平台,需要的朋友可以参考下...

    碧海微波5512021-01-07
  • Mysqlmysql中的limit用法有哪些(推荐)

    mysql中的limit用法有哪些(推荐)

    在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据,这个时候怎么办呢,mysql已经为我们提供了这样一个功能,尽管语法逻辑很是怪异,...

    MYSQL教程网2742020-08-15
  • MysqlMySQL Router实现MySQL的读写分离的方法

    MySQL Router实现MySQL的读写分离的方法

    MySQL Router是MySQL官方提供的一个轻量级MySQL中间件,用于取代以前老版本的SQL proxy。本文主要介绍了MySQL Router实现MySQL的读写分离的方法,感兴趣的可以了解...

    骏马金龙11972021-08-05
  • Mysql8种手动和自动备份MySQL数据库的方法

    8种手动和自动备份MySQL数据库的方法

    作为流行的开源数据库管理系统,MySQL的使用者众多,为了维护数据安全性,数据备份是必不可少的。本文就为大家介绍几种适用于企业的数据备份方法,需...

    IT168企业级11882019-06-21
  • MysqlMySQL中decimal类型用法的简单介绍

    MySQL中decimal类型用法的简单介绍

    今天小编就为大家分享一篇关于MySQL中decimal类型用法的简单介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小...

    CODETC6032019-06-24
  • MysqlMySql如何获取相邻数据

    MySql如何获取相邻数据

    这篇文章主要介绍了MySql如何获取相邻数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    Rude_M3372022-10-27