之前查询分页出现了一个数据重复出现的问题,第一页出现的问题第二页又出现了
经过多次查证发现一个问题:
在mysql查询中,使用limit和order by 一个非唯一字段时,结果集的顺序并不总是确定的。(后来经过验证,oracle也会出现这个问题)
大家可以清晰看到这个问题。
查询出来的11月28好的数据顺序完全不同,这样的话,limit后分页里面的数据有很大的可能会重复展示。
我在网上找到了这个bug的报告地址:http://bugs.mysql.com/bug.php?spm=5176.100239.blogcont27649.4.5KNN5j&id=72076
下面的评论详细说明了为什么会出现这种情况,大家有兴趣的话可以去看看。
官方说明如下:
“如果多个行在ORDER BY列中具有相同的值,则服务器可以按任何顺序自由返回这些行,并且可以根据总体执行计划执行不同的操作。换句话说,这些行的排序顺序相对于无序列是不确定的。
影响执行计划的一个因素是LIMIT,因此具有和不具有LIMIT的ORDER BY查询可能返回不同顺序的行”
加上我的理解,出现这种问题的原因是:limit row_count的时候
在5.6版本以前:将全表数据排序后,再进行limit截取指定行数,即row_count,在MySQL 5.6的版本上,优化器在遇到order by limit语句的时候,做了一个优化,MySQL将在找到排序结果的第一个row_count行后立即结束排序,而不是对整个结果排序。如果使用索引进行排序,这是非常快的。如果必须完成文件处理,则选择与没有LIMIT子句的查询相匹配的所有行,并且在找到第一个row_count之前对大多数或全部行进行排序。在找到初始行之后,MySQL不对结果集的任何其余部分进行排序。
当然解决方法很简单:在order by后面对重复的列进行再次排序,确定唯一顺序后再进行分页。最好是可以利用主键进行排序~