背景说明
分页查询不同页出现重复数据,底层实现都是使用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排序,但是在索引生效的时候,排序方式是按照所以的字段进行排序的。同一s q l在limit限制不同的时候对应sql的执行计划是可能不同的(可以根据如上format=json,强制走索引分析在一定限制条件下查看走索引和扫描全表的开销),导致了分页异常
解决方案:知道原因就尽量避免,增加排序字段解决问题(避免排序字段重复)