前置条件

  • Mysql 数据库版本为 8.0.20

现象

有一个 Web 服务,服务里有一个分页查询的页面,在查询的过程中同一条数据分别出现在了第 1 页和第 2 页。

原因

排查思路

  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;
    
  3. 将 sql 语句拿到数据库上运行,查看返回的数据结果。发现返回的数据有问题,两个 sql 查询出的结果出现了重复。

具体原因

在 sys_table 中的 sort 字段字段,有大量的值都为 0,为同一个值。并且此字段未添加 index,因此在查询的过程中使用了外部排序。可查看官方案例

解决方案

  1. 在字段 sort 上添加索引
  2. 在字段后面再添加一个排序字段,如 id,保证唯一性。