mysql-分页数据重复

背景说明

分页查询不同页出现重复数据,底层实现都是使用limit
select * from tt1 limit 100,50
第101条开始的50条数据
select * from tt1 limit 100
前100条记录
select * from tt1 limit 100 offset 50
从51条开始,显示后面的100条

原因分析

以前碰到过类似问题,是因为排序字段导致的,因为排序字段一样导致分页临界点的查询数据展示可能会重复
此次问题脚本如下:

explain format=json
select * from table force index(prj_rule_code) -- ignore index()
where  a字段 = ''
limit 35, 15;

前提:
对应表存在索引(a,b)联合索引
没有排序字段
当使用limit 0,10–结果正常
翻页到第二页时 limit 10,10,查询出了前一页的数据
分析流程:
比较不同页查询s q l的执行计划,发觉查询第三页的时候未走索引,直接扫描的全表,但是第二页的时候确实走了索引
在这里插入图片描述

结论

根据上述描述应该很明细可以分析出结论,没有排序字段的情况下,理论上默认排序应该是根据主键ID排序,但是在索引生效的时候,排序方式是按照索引的字段进行排序的。同一sql在limit限制不同的时候对应sql的执行计划是可能不同的(可以根据如上format=json,强制走索引分析在一定限制条件下查看走索引和扫描全表的开销),导致了分页异常
解决方案:知道原因就尽量避免,增加排序字段解决问题(避免排序字段重复)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值