MySQL order limit 数据重复

在MySQL5.6版本以前,在不能使用索引有序性的时候,如果要排序,并且使用了limit n。当偏离值比较大的时候性能急剧下降,主要原因是需要将之前的数据都装载到内存当中,造成内存浪费。

在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;
来得到您预期的结果

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 0 问题描述 在MySQL中我们通常会采用limit来进行翻页查询,比如limit(0,10)表示列出第一页的10...
    七寸知架构阅读 13,817评论 2 58
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,990评论 19 139
  • 一、MySQL架构与历史 A.并发控制 1.共享锁(shared lock,读锁):共享的,相互不阻塞的。 2.排...
    阿休阅读 10,146评论 0 37
  • 毒鸡汤杀手咪蒙又被骂了,因为上周发的那篇《我为什么支持实习生休学?》,看到这个题目时我就意料到她肯定要被骂了。 这...
    未知数S阅读 3,077评论 3 1
  • 成年礼,倍觉可笑。 没有半点温度的街道 行色匆匆的人影 校门口卖酥馍的人们 做饭阿姨的笑容和刻薄的话语 北山林场的...
    方一尘阅读 3,161评论 0 0

友情链接更多精彩内容