前置条件
- Mysql 数据库版本为 8.0.20
现象
有一个 Web 服务,服务里有一个分页查询的页面,在查询的过程中同一条数据分别出现在了第 1 页和第 2 页。
原因
排查思路
-
对请求进行抓包,发现查询第一页和第二页的参数,除了当前页数不同,无任何其他异常
-
排查服务器日志,查看相关的 SQL 语句,SQL 语句大致如下(隐去了部分隐私内容):
1 2
SELECT * FROM sys_table ORDER BY sort LIMIT 0,10; SELECT * FROM sys_table ORDER BY sort LIMIT 10,10;
-
将 sql 语句拿到数据库上运行,查看返回的数据结果。发现返回的数据有问题,两个 sql 查询出的结果出现了重复。
具体原因
在 sys_table 中的 sort 字段字段,有大量的值都为 0,为同一个值。并且此字段未添加 index,因此在查询的过程中使用了外部排序。可查看官方案例。
解决方案
- 在字段 sort 上添加索引
- 在字段后面再添加一个排序字段,如 id,保证唯一性。