在mysql8查询中使用ORDER BY结合LIMIT时,分页查询时出现后一页的数据重复前一页的部分数据。

这里写目录标题

  • 问题描述:
  • 问题模拟:
  • 原因分析
  • 问题解释
  • 问题解决
  • 验证
  • 官方文档支持

问题描述:

在mysql8查询中使用ORDER BY结合LIMIT时,分页查询时出现后一页的数据重复前一页的部分数据。

问题模拟:

  • 表table_lock_test(忽视表名)中的字段及数据如下,
    在mysql8查询中使用ORDER BY结合LIMIT时,分页查询时出现后一页的数据重复前一页的部分数据。_第1张图片
    表中总共14条数据,其中11条数据的version列的值是相同的!

  • 使用ORDER BY结合LIMIT进行分页查询,查询第1、2页:(每页显示7条),进行对比

SELECT * FROM table_lock_test ORDER BY `version` DESC LIMIT 7;
SELECT * FROM table_lock_test ORDER BY `version` DESC LIMIT 7,7;

对比结果如下:
在mysql8查询中使用ORDER BY结合LIMIT时,分页查询时出现后一页的数据重复前一页的部分数据。_第2张图片

原因分析

  • 看如下两个查询
  1. 根据version列排序,查询前10条数据
    在mysql8查询中使用ORDER BY结合LIMIT时,分页查询时出现后一页的数据重复前一页的部分数据。_第3张图片

  2. 根据version列排序,查询前5条数据
    在mysql8查询中使用ORDER BY结合LIMIT时,分页查询时出现后一页的数据重复前一页的部分数据。_第4张图片

  3. 根据以上对比,可大胆猜测,ORDER BY与LIMIT结合使用时,如果被排序ORDER BY的列的值相同,那么它们的查询结果的顺序,可能不固定。

问题解释

当查询第2页数据时,id为14 (- HJUIO- 4)的数据的顺序并不在第3的位置,而是出现在了第11的位置,作为第2页的数据再返回了, 这时结合第1页的查询数据就出现了1条重复数据; 同时,必然会出现重复多少条就会有多少数据凭空消失,结合上面的对比图可知这里消失的是id 为 8 的数据。

问题解决

如果排序ORDER BY列有相同的值的时候,再添加一个索引 INDEX列,如主键列一起排序就不会出现上面的数据重复、数据消失的问题了

验证

  • 使用ORDER BY结合LIMIT进行分页查询,查询第1、2页:(每页显示7条),进行对比, 排序时增加INDEX列,这里增加id
SELECT * FROM table_lock_test ORDER BY `version` DESC,id LIMIT 7;
SELECT * FROM table_lock_test ORDER BY `version` DESC,id LIMIT 7,7;

对比结果如下:
在mysql8查询中使用ORDER BY结合LIMIT时,分页查询时出现后一页的数据重复前一页的部分数据。_第5张图片

官方文档支持

Msql8操作手册-mysql-refman-8.0-en 第8章-8.2.1.19
在mysql8查询中使用ORDER BY结合LIMIT时,分页查询时出现后一页的数据重复前一页的部分数据。_第6张图片

你可能感兴趣的:(Mysql,数据库,ORDER,BY,LIMIT,数据重复/消失)