mysql order 排序字段存在重复值导致分页异常

作者:zarte    发布时间: 2020-09-26

mysqlorder

异常

各类数据库在排序字段存在重复值的情况下都会出现此问题,表现为limit 15,10 的数据与 limit 15,11的数据顺序不一致,甚至数据不一致。

ORDER BY
    pay_date DESC
LIMIT 15,10

Img

ORDER BY
    pay_date DESC
LIMIT 15,11

Img

原因

Mysql会对Limit做优化,具体优化方式见官方文档:https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html Img

如果你将Limit row_count与order by混用,mysql会找到排序的row_count行后立马返回,而不是排序整个查询结果再返回。如果是通过索引排序,会非常快;如果是文件排序,所有匹配查询的行(不带Limit的)都会被选中,被选中的大多数或者全部会被排序,直到limit要求的row_count被找到了。如果limit要求的row_count行一旦被找到,Mysql就不会排序结果集中剩余的行了。

对于不准的问题,官方文档里面做了如下说明: Img

如果order by的字段有多个行都有相同的值,mysql是会随机的顺序返回查询结果的,具体依赖对应的执行计划。也就是说如果排序的列是无序的,那么排序的结果行的顺序也是不确定的。

解决方案

Img 额外加一个排序条件,例如唯一的id字段。

上一篇:  swoft自动化测试踩坑记录

加载更多