栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MYSQL问题:order by + limit分页时数据重复

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MYSQL问题:order by + limit分页时数据重复

问题描述:MYSQL version 5.6.8

command 表结构

CREATE TABLE

command

(

ID INT NOT NULL,

NAME VARCHAr(16),

DEscriptION VARCHAr(32),

INDEX idx_command_id (ID)

)

ENGINE=InnoDB DEFAULT CHARSET=utf8;

表数据

order by + limit分页查询

查询第1页

select * from command order by age limit 0,4;

查询第2页

select * from command order by age limit 4,4;

可以看到第2页中查出了第1页中存在的重复数据

原因分析:

查看以上语句的执行计划

可以看到,order by limit时Mysql会进行优化,使用的是内存中的filesort文件排序,in memory filesort 使用的是优先级队列(priority queue),优先级队列使用的二叉堆;

使用 priority queue 的目的,就是在不能使用索引有序性的时候,如果要排序,并且使用了limit n,那么只需要在排序的过程中,保留n条记录即可这样虽然不能解决所有记录都需要排序的开销,但是只需要 sort buffer 少量的内存就可以完成排序。

因此,在limit n时,只会堆排序前n个,且是不稳定排序,因此并不能保证字段值相同时的相对顺序,因此分页时可能造成重复;

MySQL 5.5 没有这个优化,所以也就不会出现这个问题,5.6版本之后才出现了这种情况。

解决方案:

1. 新加一个排序字段,这个字段绝对有序,在第1个排序字段重复时, 使用第2个字段排序

2. 利用索引的有序性,如给id加上主键约束,排序字段添加索引

explain select id,age from command order by age limit 4,4

可以看到查询走了索引,排序就稳定了,没什么问题

参考:

小心避坑:MySQL分页时使用 limit+order by 会出现数据重复问题

如何解决MySQL order by limit语句的分页数据重复问题?

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/605822.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号