如何解决MySQL order by limit语句的分页数据重复问题?

文章探讨了MySQL 5.6版本在order by limit语句中出现的分页数据重复问题,原因是priority queue优化导致的堆排序不稳定。解决方案包括为排序字段添加索引,理解分页本质,以及注意数据库在无order by时的记录顺序不确定性。此外,还分享了数据库排序和分页常见问题,以及作者的个人经验。
摘要由CSDN通过智能技术生成

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版本之后才出现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值