千家信息网

怎么解决MySQL分页时使用 limit+order by出现数据重复的问题

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这期内容当中小编将会给大家带来有关怎么解决MySQL分页时使用 limit+order by出现数据重复的问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。0 问题
千家信息网最后更新 2026年11月02日怎么解决MySQL分页时使用 limit+order by出现数据重复的问题

这期内容当中小编将会给大家带来有关怎么解决MySQL分页时使用 limit+order by出现数据重复的问题,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

0 问题描述

在MySQL中我们通常会采用limit来进行翻页查询,比如limit(0,10)表示列出第一页的10条数据,limit(10,10)表示列出第二页。但是,当limit遇到order by的时候,可能会出现翻到第二页的时候,竟然又出现了第一页的记录。

具体如下:

SELECT `post_title`, `post_date` FROM post WHERE `post_status`='publish' ORDERBY view_countdesc LIMIT 5,5

使用上述SQL查询的时候,很有可能出现和LIMIT 0,5相同的某条记录。而如果使用如下方式,则不会出现重复的情况:

SELECT * FROM post WHERE post_status='publish' ORDERBY view_countdesc LIMIT 5,5

但是,由于post表的字段很多,仅仅希望用这两个字段,不想把post_content也查出来。为了解决这个情况,在ORDER BY后面使用了两个排序条件来解决这个问题,如下:

SELECT `post_title`, `post_date` FROM post WHERE `post_status`='publish' ORDERBY view_countdesc, IDasc LIMIT 5,5

按理来说,MySQL的排序默认情况下是以主键ID作为排序条件的,也就是说,如果在view_count相等的情况下,主键ID作为默认的排序条件,不需要我们多此一举加ID asc。但是事实就是,MySQL再order by和limit混用的时候,出现了排序的混乱情况。

1 分析问题

在MySQL 5.6的版本上,优化器在遇到order by limit语句的时候,做了一个优化,即 使用了priority queue。

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

之所以MySQL 5.6出现了第二页数据重复的问题,是因为 priority queue 使用了堆排序的排序方法,而堆排序是一个不稳定的排序方法,也就是相同的值可能排序出来的结果和读出来的数据顺序不一致。

MySQL 5.5 没有这个优化,所以也就不会出现这个问题。

也就是说,MySQL 5.5是不存在本文提到的问题的,5.6版本之后才出现了这种情况。

再看下MySQL解释sql语言时的执行顺序:

(1)SELECT
(2)DISTINCT
(3)FROM
(4)JOIN
(5)ON
(6)WHERE
(7)GROUPBY
(8)HAVING
(9)ORDERBY
(10)LIMIT

执行顺序依次为 form… where… select… order by… limit…,由于上述priority queue的原因,在完成select之后,所有记录是以堆排序的方法排列的,在进行order by时,仅把view_count值大的往前移动。

但由于limit的因素,排序过程中只需要保留到5条记录即可,view_count并不具备索引有序性,所以当第二页数据要展示时,mysql见到哪一条就拿哪一条,因此,当排序值相同的时候,第一次排序是随意排的,第二次再执行该sql的时候,其结果应该和第一次结果一样。

2 解决方法

1.索引排序字段

如果在字段添加上索引,就直接按照索引的有序性进行读取并分页,从而可以规避遇到的这个问题。

2.正确理解分页

分页是建立在排序的基础上,进行了数量范围分割。排序是数据库提供的功能,而分页却是衍生出来的应用需求。

在MySQL和Oracle的官方文档中提供了limit n和rownum < n的方法,但却没有明确的定义分页这个概念。

还有重要的一点,虽然上面的解决方法可以缓解用户的这个问题,但按照用户的理解,依然还有问题:比如,这个表插入比较频繁,用户查询的时候,在read-committed的隔离级别下,第一页和第二页仍然会有重合。

所以,分页一直都有这个问题,不同场景对数据分页都没有非常高的准确性要求。

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

不加order by的时候的排序问题

用户在使用Oracle或MySQL的时候,发现MySQL总是有序的,Oracle却很混乱,这个主要是因为Oracle是堆表,MySQL是索引聚簇表的原因。所以没有order by的时候,数据库并不保证记录返回的顺序性,并且不保证每次返回都一致的。

分页问题 分页重复的问题

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

NULL值和空串问题

不同的数据库对于NULL值和空串的理解和处理是不一样的,比如Oracle NULL和NULL值是无法比较的,既不是相等也不是不相等,是未知的。而对于空串,在插入的时候,MySQL是一个字符串长度为0的空串,而Oracle则直接进行NULL值处理。

上述就是小编为大家分享的怎么解决MySQL分页时使用 limit+order by出现数据重复的问题了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。

排序 问题 数据 时候 情况 数据库 方法 索引 有序 字段 用户 空串 顺序 相同 也就是 就是 有序性 条件 结果 保证 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网金融科技 互联网科技作文 朗涯互联网科技 互联网科技的未来发展 互联网科技宣传片 互联网金融科技委员会 汉立互联网科技有限公司联系电话 北京三清互联网科技 互联网和黑科技的看法 民营互联网公司国防科技 互联网公司黑科技创始人 工业互联网等科技实现智能化赋能 黑云互联网科技有限公司 领航科技大厦互联网公司 互联网科技手机排行榜 万物互联网智能科技 互联网界的黑科技 北京军民互联网科技公司 广西泛欧互联网科技有限公司 盐城市攀科互联网科技有限公司 花魁咖啡 互联网金融监管科技数据 时间互联网络科技 互联网科技公司的市场部门 玖二柒互联网科技公司待遇 允成互联网科技有限公司融资 佛山市翊博互联网络科技有限公司 互联网金融科技公司的优势 北京瑞云互联网科技有限公司 银川新华互联网科技学校招聘
0