今天遇到了mysql分页查询,来记录一下。
mysql对limit的解释:
如果多个行在列中具有相同的值ORDER BY,则服务器可以按任意顺序自由返回这些行,并且根据总体执行计划可能会有所不同。换句话说,这些行的排序顺序对于无序列是非确定性的。
在order by的值相同时,返回的顺序不一定一致。
原因是在MySQL 5.6版本,优化器在遇到order by xxx limit x,x 时,会做一个优化,使用优先队列,来进行排序,这样的好处在于在排序过程中,仅保留需要的n条数据即可。但是优先队列使用的是堆排序,是不稳定排序,所以导致了这个问题。
解决方法:
order by后加一个唯一字段(id)进行排序
给order by字段加上索引
排序的稳定性:
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
几个常用排序算法的稳定性
冒泡排序:稳定
选择排序:不稳定,每次选择最小的与之前交换,可能会将相同元素的顺序打乱
插入排序:稳定
快速排序:不稳定,不稳定发生在key与相遇点进行交换时。
归并排序:稳定
基数排序:稳定
希尔排序:不稳定,插入顺序不同,相同元素可能在不同的插入顺序中分别排序
堆排序:不稳定,可能子节点与父节点进行交换时,将两个相同元素顺序打乱。
文章转载自测试备忘录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




