MySQL 分页出现重复数据
2025-01-22 08:19:30 466 字
This post is also available in English and alternative languages.
在用 MySQL 测试分页时发现,查询结果可能会有记录重复的情况。
浅谈 MySQL 分页优化。本篇酌情删改,推荐阅读原文。
1. MySQL 分页重复数据
比如下面这两条分页 SQL 语句:
1 | select * from news_info order by source limit 0, 10; |
对应的查询结果如下两张图:
这两次分页查询,除了 334373、334376 这两个id,其他的数据都出现了重复。
对于该问题,MySQL 官方文档中已有解释:8.2.1.19 LIMIT Query Optimization
If multiple rows have identical values in the
ORDER BY
columns, the server is free to return those rows in any order, and may do so differently depending on the overall execution plan. In other words, the sort order of those rows is nondeterministic with respect to the nonordered columns.
简单来说,出现该现象的本质就在于MySQL每次返回行的顺序是不确定的。故在分页查询时会有一定的可能和概率,出现上述这种记录重复、遗漏的问题。解决该问题的思路也很简单。分页查询时,使用 order by
语句添加一个具有唯一性的排序字段。之所以使用唯一性字段进行排序,是因为如果排序字段使用非唯一性字段。由于该字段的值存在相同的可能,进而又会导致在排序时出现顺序不确定的问题。
1 | -- 添加唯一性字段`id`排序, 确保分页结果稳定 |
同时在分页查询中,如果业务上需要使用非唯一性字段进行排序。为保证分页结果稳定,可以在 order by
语句最后追加一个唯一性字段来保证分页结果稳定。