背景说明

分页查询不同页出现重复数据,底层实现都是使用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,强制走索引分析在一定限制条件下查看走索引和扫描全表的开销),导致了分页异常
解决方案:知道原因就尽量避免,增加排序字段解决问题(避免排序字段重复)

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐