SQL语句 order by 与limit 使用出现数据重复问题

在执行 分页查询时候,出现页码之间数据重复现象


SELECT * FROM goms_user WHERE department_1=2 AND is_delete=0  ORDER BY create_time DESC  LIMIT 0,10


SELECT * FROM goms_user WHERE department_1=2 AND is_delete=0  ORDER BY create_time DESC  LIMIT 10,10

出现 数据重复,当去除order by 字段时后 ,数据就是正常的。
原因是:
我的排序字段 create_time 很多是0,就是出现 字段值相同的情况,当排序字段值相同时,mysql 默认按照主键排序,就出现这个问题。

在MySQL 5.6的版本上,优化器在遇到order by limit语句的时候,做了一个优化,即使用了priority queue。……

使用 priority queue 的目的,就是在不能使用索引有序性的时候,如果要排序,并且使用了limit

n,那么只需要在排序的过程中,保留n条记录即可,这样虽然不能解决所有记录都需要排序的开销,但是只需要 sort buffer

少量的内存就可以完成排序。

之所以5.6出现了第二页数据重复的问题,是因为 priority queue使用了堆排序的排序方法,而堆排序是一个不稳定的排序方法,也就是相同的值可能排序出来的结果和读出来的数据顺序不一致。

5.5 没有这个优化,所以也就不会出现这个问题。

也就是说,mysql5.5是不存在本文提到的问题的,5.6版本之后才出现了这种情况。

我们再看下mysql解释sql语言时的执行顺序:

(7) SELECT
(8) DISTINCT
(1) FROM
(3) JOIN
(2) ON
(4) WHERE
(5) GROUP BY
(6) HAVING
(9) ORDER BY
(10) LIMIT

你可能感兴趣的:(Mysql)