千家信息网

小心避坑:MySQL分页时出现的数据重复问题

发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,全文链接: https://www.modb.pro/db/232010 问题描述在MySQL中我们通常会采用limit来进行翻页查询,比如limit(0,10)表示列出第一页的10条数据,limit
千家信息网最后更新 2025年11月13日小心避坑:MySQL分页时出现的数据重复问题

全文链接: https://www.modb.pro/db/23201

0 问题描述

在MySQL中我们通常会采用limit来进行翻页查询,比如limit(0,10)表示列出第一页的10条数据,limit(10,10)表示列出第二页。但是,当limit遇到order by的时候,可能会出现翻到第二页的时候,竟然又出现了第一页的记录。
具体如下:
SELECT
`post_title`,
`post_date`
FROM
post
WHERE
`post_status` = 'publish'
ORDER BY
view_count desc
LIMIT
5, 5

使用上述SQL查询的时候,很有可能出现和LIMIT 0,5相同的某条记录。而如果使用如下方式,则不会出现重复的情况:
SELECT
*
FROM
post
WHERE
post_status = 'publish'
ORDER BY
view_count desc
LIMIT
5, 5

但是,由于post表的字段很多,仅仅希望用这两个字段,不想把post_content也查出来。为了解决这个情况,在ORDER BY后面使用了两个排序条件来解决这个问题,如下:
SELECT
`post_title`,
`post_date`
FROM
post
WHERE
`post_status` = 'publish'
ORDER BY
view_count desc,
ID asc
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) GROUP BY
(8) HAVING
(9) ORDER BY
(10) LIMIT

执行顺序依次为 form… where… select… order by… limit…,由于上述priority queue的原因,在完成select之后,所有记录是以堆排序的方法排列的,在进行order by时,仅把view_count值大的往前移动。
但由于limit的因素,排序过程中只需要保留到5条记录即可,view_count并不具备索引有序性,所以当第二页数据要展示时,mysql见到哪一条就拿哪一条,因此,当排序值相同的时候,第一次排序是随意排的,第二次再执行该sql的时候,其结果应该和第一次结果一样。

......

查看全文请点击文章顶部链接

排序 时候 问题 情况 数据 相同 也就是 方法 条件 结果 顺序 有序 两个 也就是说 全文 字段 就是 有序性 版本 第一次 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 软件开发工程师有什么职业 安徽使用软件开发创新服务 软件开发对人格特质要求 网络工作室软件开发 数据库创建外连接 互联网科技助推汽车金融 重庆邮电大学网络技术 肥西租房软件开发 如何从云备份恢复数据库 苏建宇网络安全讲座 南京学习软件开发哪家好 安徽系统软件开发培训 伴伴上海网络技术有限公司怎样 win7调整分区大小数据库 大数据和网络安全哪个方向 目前旅游电子商务数据库 德州网络机顶盒时间服务器 食人鱼字幕软件开发 网络安全哪里培训比较好 网络安全宣传周织密防护网 南昌大学数据库期末考试题 数据库技术和信息安全技术 苏州橡胶零件加工管理软件开发 数据库代金券合作伙伴 肥西租房软件开发 网络安全杀伤链入侵阶段 discuz 数据库破解 可可软件开发者账号注册 eid网络安全概念股 数据库的设计的基本步骤
0