前言:
上个月,部门同事发现了代码中的一个bug,就是在分页查询的时候使用order by limit,由于order by后面没有加索引,所以查出来的数据会出现重复的问题。这个是MYSQL 5.6以后的版本出现的问题,在MYSQL 5.5之前的版本中不会出现。
正文:
找到了网上的相关解释,但是这里红框中的内容我不是很明白,按我的理解主要的优点是只需要缓冲少量的内存(不知道对不对,以后需要深究):
之所以堆排序的不稳定性会导致“相同的值可能排序出来的结果和读出来的数据顺序不一致”的原因是:
比如:3 27 36 27
如果堆顶是“3”先输出,那第三层的“27”会跑到堆顶,然后堆稳定,继续输出堆顶。这样的话,第四个“27”会先于第二个“27”输出堆顶,所以堆排序不稳定。
参考链接:
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