order by + limit分页时数据重复问题及解决方法

 更新时间:2023年03月18日 14:30:17   作者:如来神掌十八式  
这篇文章主要介绍了order by + limit分页时数据重复,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

问题描述:MYSQL version 5.6.8command 表结构

CREATE TABLE

command

(

ID INT NOT NULL,

NAME VARCHAR(16),

DESCRIPTION VARCHAR(32),

INDEX idx_command_id (ID)

)

ENGINE=InnoDB DEFAULT CHARSET=utf8;

表数据

order by + limit分页查询

查询第1页

select * from command order by age limit 0,4;

查询第2页

select * from command order by age limit 4,4;

可以看到第2页中查出了第1页中存在的重复数据

原因分析:

查看以上语句的执行计划

可以看到,order by limit时Mysql会进行优化,使用的是内存中的filesort文件排序,in memory filesort 使用的是优先级队列(priority queue),优先级队列使用的二叉堆;

使用 priority queue 的目的,就是在不能使用索引有序性的时候,如果要排序,并且使用了limit n,那么只需要在排序的过程中,保留n条记录即可这样虽然不能解决所有记录都需要排序的开销,但是只需要 sort buffer 少量的内存就可以完成排序。

因此,在limit n时,只会堆排序前n个,且是不稳定排序,因此并不能保证字段值相同时的相对顺序,因此分页时可能造成重复;

MySQL 5.5 没有这个优化,所以也就不会出现这个问题,5.6版本之后才出现了这种情况。

解决方案:

1. 新加一个排序字段,这个字段绝对有序,在第1个排序字段重复时, 使用第2个字段排序

2. 利用索引的有序性,如给id加上主键约束,排序字段添加索引

explain select id,age from command order by age limit 4,4

可以看到查询走了索引,排序就稳定了,没什么问题

(3)一些常见的数据库排序问题

不加order by的时候的排序问题
用户在使用Oracle或MySQL的时候,发现MySQL总是有序的,Oracle却很混乱,这个主要是因为Oracle是堆表,MySQL是索引聚簇表的原因。

所以没有order by的时候,数据库并不保证记录返回的顺序性,并且不保证每次返回都一致的。

分页问题

分页重复的问题

如前面所描述的,分页是在数据库提供的排序功能的基础上,衍生出来的应用需求,数据库并不保证分页的重复问题。

到此这篇关于order by + limit分页时数据重复的文章就介绍到这了,更多相关order by  limit分页时数据重复内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中truncate误操作后的数据恢复案例

    MySQL中truncate误操作后的数据恢复案例

    这篇文章主要介绍了MySQL中truncate误操作后的数据恢复案例,主要是要从日志中定位到truncate操作的地方然后备份之前丢失的数据,需要的朋友可以参考下
    2015-05-05
  • mysql日志文件General_log和Binlog开启及详解

    mysql日志文件General_log和Binlog开启及详解

    MySQL中的数据变化会体现在上面日志中,下面这篇文章主要给大家介绍了关于mysql日志文件General_log和Binlog开启及详解的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • 你的like语句为什么没索引详解

    你的like语句为什么没索引详解

    这篇文章主要给大家介绍了关于你的like语句为什么没索引的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-10-10
  • MySql 8.0.11安装配置教程

    MySql 8.0.11安装配置教程

    这篇文章给大家介绍了MySql 8.0.11安装配置教程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,感兴趣的朋友一起看看吧
    2018-05-05
  • 你真的会用Mysql的explain吗

    你真的会用Mysql的explain吗

    explain显示了mysql如何使用索引来处理select语句以及连接表,可以帮助选择更好的索引和写出更优化的查询语句,下面这篇文章主要给大家介绍了关于Mysql中explain用法的相关资料,需要的朋友可以参考下
    2022-03-03
  • VSCODE连接MySQL数据库服务图文教程

    VSCODE连接MySQL数据库服务图文教程

    最近做网页碰到连接数据库的问题,上网查了挺久终于搞明白了,下面这篇文章主要给大家介绍了关于VSCODE连接MySQL数据库服务的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • MySQL对JSON数据进行查询实例代码

    MySQL对JSON数据进行查询实例代码

    这篇文章主要给大家介绍了关于MySQL对JSON数据进行查询的相关资料,MySQL支持使用JSON类型存储数据,并提供了多种查询JSON数据的方法,需要的朋友可以参考下
    2023-07-07
  • MYSQL无法启动提示: Default storage engine (InnoDB) is not available的解决方法

    MYSQL无法启动提示: Default storage engine (InnoDB) is not availabl

    自己用的MYSQL都是用MYISAM数据库,还没涉及到需要INNODB,因此打算直接不加载INNODB引擎。
    2011-05-05
  • mysql中varchar和text的区别和比较

    mysql中varchar和text的区别和比较

    在存储字符串时可以使用char、varchar或者text类型,下面这篇文章主要给大家介绍了关于mysql中varchar和text的区别和比较的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • MySQL不推荐使用uuid或者雪花id作为主键的原因分析

    MySQL不推荐使用uuid或者雪花id作为主键的原因分析

    在数据库设计中,选择适当的主键类型对于数据的存储和查询效率至关重要,在MySQL中,有些开发者倾向于使用UUID或者雪花ID作为主键,以确保数据的唯一性,本文将探讨在MySQL中不推荐使用UUID或者雪花ID作为主键的原因,并与其他主键类型进行差异化对比
    2023-11-11

最新评论