mysql 分页 重复_Mysql分页重复问题

本文介绍了在MySQL分页查询时遇到的重复数据问题,分析了问题原因,包括MySQL的filesort优化和排序字段的重复性,并提出了两种解决方案:为排序字段添加索引或者在查询时结合主键进行排序,以避免重复现象。
摘要由CSDN通过智能技术生成

因为这个Bug,同事差点被祭天​mp.weixin.qq.com90dc4c6ac0211365592ebfd69dc2dec0.png

前言

前些天同事告诉我遇到一个的Bug.

Mysql分页时每页的数据中有重复的数据.

我一听惊呆了,以前怎么都没有遇见这种事情.

案件重演

用于涉及到业务表,不方便截图.就用简单的模拟数据表来进行测试吧!

创建学生表

CREATE TABLE `student` (

`student_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '学生ID',

`name` varchar(20) NOT NULL COMMENT '姓名',

`score` int(4) DEFAULT NULL COMMENT '成绩',

PRIMARY KEY (`student_id`)

) ENGINE=InnoDB AUTO_INCREMENT=146 DEFAULT CHARSET=utf8mb4 COMMENT='学生表';

插入20条数据

INSERT INTO `student`

VALUES

(1, 'King1', 97),

(2, 'King2', 96),

(3, 'King3', 96),

(4, 'King4', 96),

(5, 'King5', 96),

(6, 'King6', 96),

(7, 'King7', 96),

(8, 'King8', 96),

(9, 'King9', 96),

(10, 'King10', 96),

(11, 'King11', 96),

(12, 'King12', 96),

(13, 'King13', 96),

(14, 'King14', 96),

(15, 'King15', 96),

(16, 'King16', 96),

(17, 'King17', 96),

(18, 'King18', 96),

(19, 'King19', 96),

(20, 'King20', 96);

按照分数对学生进行倒叙排列, 然后每页查询10条数据.

第一页数据

第二页数据

我们可以发现数据总共是有20条的.但是分页查询时,

第一页和第二页中的数据竟然大量重复了.

测到这里我感觉产品和测试已经在提刀来的路上了!

问题分析Mysql 版本5.5以上

排序字段中的值大量重复

查询时使用了排序和Limit N,M语句

排序字段不是索引字段

下面我们就对上面的几点来进行仔细的说明.

首先是因为MYSQL5.5之后加入了排序优化filesort.

关于稳定排序和非稳定排序大家可以参考这篇文章

MYSQL官网上对filesort的说明,感兴趣的可以去搜一搜

网上找到的一位大佬对filesort的解释, 总结说就是因为filesort采用的是不稳定的快速排序和堆排序,所以才会出现排序不稳定的现象

其次是因为我们的数据的排序字段存在大量的重复,导致问题加速暴露.

解决方案:

1. 可以考虑在排序字段上加上索引,让排序优先走索引,这样就可以避免filesort排序了

2. 不采用上面方案的情况下,可以考虑假如额外字段进行排序,例如加入主键排序,这样就不会出现排序重复的问题了!

结束

以上就是我对这次问题的一个完整分析.

总的来说还是因为自己很菜,没有对自己使用的技术进行深入的学习和研究.

菜没有错,菜还不学习就是你的错了!

也希望看到的小伙伴能和我一样对学习抱有敬畏之心,知其然还要知其所以然!

好啦,今天就分享到这里啦, 感谢大家的观看!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值