mysql 5.6 order by limit 排序分页数据重复问题

博客讨论了在MySQL5.6及以上版本中,使用orderbylimit进行分页查询时可能出现数据重复的问题,这与堆排序的不稳定性有关。当orderby字段没有索引时,数据排序可能会不稳定,导致相同值的顺序不一致。解决这个问题的关键在于为orderby字段创建索引。文章引用了多个在线资源和相关书籍《高性能MYSQL》作为参考。
摘要由CSDN通过智能技术生成

前言:

        上个月,部门同事发现了代码中的一个bug,就是在分页查询的时候使用order by limit,由于order by后面没有加索引,所以查出来的数据会出现重复的问题。这个是MYSQL 5.6以后的版本出现的问题,在MYSQL 5.5之前的版本中不会出现。

 

正文:

        找到了网上的相关解释,但是这里红框中的内容我不是很明白,按我的理解主要的优点是只需要缓冲少量的内存(不知道对不对,以后需要深究):

201337_JEJK_3586186.png

        之所以堆排序的不稳定性会导致“相同的值可能排序出来的结果和读出来的数据顺序不一致”的原因是:

比如:3 27 36 27

 

 

 

                                                  201804_l2mx_3586186.png

如果堆顶是“3”先输出,那第三层的“27”会跑到堆顶,然后堆稳定,继续输出堆顶。这样的话,第四个“27”会先于第二个“27”输出堆顶,所以堆排序不稳定。

                          203040_JIA2_3586186.png                              203229_QKgG_3586186.png

 

参考链接:

1、mysql 5.6 order by limit 排序分页数据重复问题:
http://blog.csdn.net/qq_27317147/article/details/76474624
http://bbs.csdn.net/topics/392190327?page=1
2、表索引过多的坏处:
https://zhidao.baidu.com/question/298099003.html
3、堆排序的不稳定性:
https://zhidao.baidu.com/question/589205766.html
http://blog.csdn.net/fjqcyq2/article/details/47086769
http://bbs.csdn.net/topics/200016696
4、优先队列相关介绍:
http://blog.csdn.net/stand1210/article/details/52464922
http://blog.csdn.net/u013309870/article/details/71189189
5、MYSQL的排序缓冲:
http://imysql.cn/2008_09_27_deep_into_mysql_sort_buffer

6、Mysql官网解释:
https://dev.mysql.com/doc/refman/5.6/en/limit-optimization.html

 

推荐书籍:

《高性能MYSQL》

转载于:https://my.oschina.net/linxxbaobao/blog/1628027

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值