MySQL 使用 order by 某个字段 limit offset 分页排序可能会导致数据丢失和重复

问题

最近在项目中遇到一个很神奇的问题,MySQL 使用 order by 进行排序并进行分页的时候,会出现部分数据丢失和重复。具体看下面这三张图
MySQL 使用 order by 某个字段 limit offset 分页排序可能会导致数据丢失和重复_第1张图片
MySQL 使用 order by 某个字段 limit offset 分页排序可能会导致数据丢失和重复_第2张图片
MySQL 使用 order by 某个字段 limit offset 分页排序可能会导致数据丢失和重复_第3张图片
其中,

第一张图查询所有数据,并按 sort 字段排序,
第二张图,查询从第 1 条数据开始,查询 10 条数据,并按 sort 字段排序,
第三张图,查询从第 11 条数据开始,查询 10 条数据,并按 sort 字段排序,
仔细看我用红色标记出来的,可以发现,分类11 的数据在分页后查询不出来,而分类18 则出现了两次。很明显的发现,当进行数据分页时,部分数据出现了丢失和重复。

分析原因

在 MySQL 关系型数据库中,往往会存在多种排序算法。通过 MySQL 的源码和官方文档介绍可以得知,它的排序规律可以总结如下:

  • 当 order by 不使用索引进行排序时,将使用排序算法进行排序;
  • 若排序内容能全部放入内存,则仅在内存中使

你可能感兴趣的:(Java生态圈,mysql,android,数据库)