mysql 5.6 order by limit 排序分页数据重复问题
2017-12-04 16:04
1681 查看
今天使用mybatis和PageHelper分页查询时出现了重复数据的问题,一开始以为sql有错,检查了没有问题。
之后就测试数据没发现了问题。百度了一下发现order by limit 这个问题。使用版本mysql 5.7.20。
select * from table order by xx limit 0,10
当xx不存在索引,且有xx相同的行是,可能出现分页数据重复问题
原因:
在MySQL 5.6的版本上,优化器在遇到order by limit语句的时候,做了一个优化,即使用了priority
queue。使用
priority queue 的目的,就是在不能使用索引有序性的时候,如果要排序,并且使用了limit n,那么只需要在排序的过程中,保留n条记录即可,这样虽然不能解决所有记录都需要排序的开销,但是只需要 sort buffer 少量的内存就可以完成排序。之所以5.6出现了第二页数据重复的问题,是因为 priority queue 使用了堆排序的排序方法,而堆排序是一个不稳定的排序方法,也就是相同的值可能排序出来的结果和读出来的数据顺序不一致。5.5
没有这个优化,所以也就不会出现这个问题。
解决办法:
1.加上索引排序
select
* from table order by xx,id(任意有索引的字段) limit 0,10
2、给xx字段加上索引
作为验证,您可以在这个字段上加索引 alter table tea_course_sort add index(course_sort_order),然后由于这个表数目太小,以防加索引都未必能用得上,语句修改为
select * from tea_course_sort force index(course_sort_order) order by tea_course_sort.course_sort_order
desc limit 0,10;
来得到您预期的结果
之后就测试数据没发现了问题。百度了一下发现order by limit 这个问题。使用版本mysql 5.7.20。
select * from table order by xx limit 0,10
当xx不存在索引,且有xx相同的行是,可能出现分页数据重复问题
原因:
在MySQL 5.6的版本上,优化器在遇到order by limit语句的时候,做了一个优化,即使用了priority
queue。使用
priority queue 的目的,就是在不能使用索引有序性的时候,如果要排序,并且使用了limit n,那么只需要在排序的过程中,保留n条记录即可,这样虽然不能解决所有记录都需要排序的开销,但是只需要 sort buffer 少量的内存就可以完成排序。之所以5.6出现了第二页数据重复的问题,是因为 priority queue 使用了堆排序的排序方法,而堆排序是一个不稳定的排序方法,也就是相同的值可能排序出来的结果和读出来的数据顺序不一致。5.5
没有这个优化,所以也就不会出现这个问题。
解决办法:
1.加上索引排序
select
* from table order by xx,id(任意有索引的字段) limit 0,10
2、给xx字段加上索引
作为验证,您可以在这个字段上加索引 alter table tea_course_sort add index(course_sort_order),然后由于这个表数目太小,以防加索引都未必能用得上,语句修改为
select * from tea_course_sort force index(course_sort_order) order by tea_course_sort.course_sort_order
desc limit 0,10;
来得到您预期的结果
相关文章推荐
- mysql 5.6 order by limit 排序分页数据重复问题
- 数据库分页时order by排序不唯一,分页出现重复数据问题
- mysql分页加排序数据重复问题解决方案
- SQL分页排序的实现与分页数据重复问题——以Oracle rownum为例
- ORCALE 分页查询order by 的字段数据重复问题
- mysql orderby limit 翻页数据重复的问题
- SQL分页排序的实现与分页数据重复问题——以Oracle rownum为例
- mysql5.6中 order by 多个字段排序问题
- mysql优化----大数据下的分页,延迟关联,索引与排序的关系,重复索引与冗余索引,索引碎片与维护
- MySQL分页拉取和客户端数据重复问题
- SQL分页排序的实现与分页数据重复问题——以Oracle rownum为例
- MYSQL根据热门条件进行排序分页,防止分页有重复数据
- SQL分页排序的实现与分页数据重复问题——以Oracle rownum为例
- 使用mysql的limit进行分页时出现重复问题
- mysql GROUP BY 与 ORDER BY数据排序问题
- 从Yii框架分页数据“丢失”到MySQL的ORDER BY和LIMIT子句
- Oracle分页查询排序数据重复问题
- 解决Mysql数据量大的时候 分页优化(使用limit)的问题
- mysql数据去重并排序使用distinct 和 order by 的问题
- 使用mysql的limit进行分页时出现重复问题