首页 > 数据库 >MySQL分页查询详解:优化大数据集的LIMIT和OFFSET

MySQL分页查询详解:优化大数据集的LIMIT和OFFSET

时间:2023-09-05 18:03:12浏览次数:40  
标签:info 10 分页 OFFSET 查询 LIMIT MySQL


最近在工作中,我们遇到了一个需求,甲方要求直接从数据库导出一个业务模块中所有使用中的工单信息。为了实现这一目标,我编写了一条SQL查询语句,并请求DBA协助导出数据。尽管工单数量并不多,只有3000多条,但每个工单都包含了大量的信息。DBA进行了多次导出操作,不幸的是,每次尝试导出都导致了操作平台的卡顿和无响应。

为了克服这一问题,我们决定采用MySQL的分页技术,具体使用了LIMIT和OFFSET关键词,将导出操作拆分成多个批次进行。通常,我们在项目中使用一些开源插件如pagehelper等来实现页面分页,很少自己在sql中编写分页逻辑。但在这次需求中,我们不得不深入了解并使用了MySQL的分页功能。

在本文中,我们将详细探讨MySQL中的LIMITOFFSET关键词,以及如何通过性能优化来处理分页查询,以满足业务需求。

什么是分页查询?

分页查询是一种将大型数据集拆分成可管理块的技术,以便在用户界面中逐页显示。这在Web应用、移动应用和报告生成中非常常见,它有助于提高性能并改善用户体验,因为不需要一次加载全部数据。

分页关键字

LIMIT关键字

LIMIT关键字用于限制返回结果集中的行数。其基本语法如下:

SELECT * FROM 表名 LIMIT 行数;

例如,要从名为mark_info的表中选择最新创建的10个工单的信息,可以执行以下查询:

SELECT * FROM mark_info ORDER BY CREATE_TIME DESC  LIMIT 10;

OFFSET关键字

OFFSET关键字用于指定从结果集的哪一行开始返回数据。通常,它与LIMIT一起使用,以实现分页效果。其语法如下:

SELECT * FROM 表名 LIMIT 行数 OFFSET 偏移量;

或者

SELECT * FROM 表名 LIMIT 行数 , 偏移量;

这两写法效果是一样的。

例如,要从mark_info表中选择选择最新创建的第11到第20个工单的信息,可以执行以下查

SELECT * FROM mark_info ORDER BY CREATE_TIME DESC  LIMIT 10 OFFSET 10;

或者

SELECT * FROM mark_info ORDER BY CREATE_TIME DESC  LIMIT 10 , 10;

分页查询的示例

假设我们有一个名为bus_work_order_operate_info的表,其中存储了大量工单操作记录。我们希望实现一个分页功能,每页显示10个工单操作的信息。以下是如何执行分页查询的示例:

-- 第一页,显示最新的10个工单操作信息
SELECT * FROM bus_work_order_operate_info ORDER BY OPERATE_TIME DESC LIMIT 10;

-- 第二页,显示接下来的10个工单操作信息
SELECT * FROM bus_work_order_operate_info ORDER BY OPERATE_TIME DESC LIMIT 10 OFFSET 10;

-- 第三页,显示接下来的10个工单操作信息
SELECT * FROM bus_work_order_operate_info ORDER BY OPERATE_TIME DESC LIMIT 10 OFFSET 20;

-- 以此类推...

性能优化

我们在很多的实际应用场景中,一般 limit 加上偏移量,加上order by 子句,配合合适的索引,效率通常不错。但是当偏移量非常大的时候,需要跳过大量的数据,这样会有很大的性能问题。以下是一个优化的示例:

未优化sql

SELECT * FROM bus_work_order_operate_info ORDER BY OPERATE_TIME DESC LIMIT 10 OFFSET 5000;

查询分析

MySQL分页查询详解:优化大数据集的LIMIT和OFFSET_mysql

优化后sql

select T1.* from bus_work_order_operate_info T1  INNER JOIN (select ID FROM bus_work_order_operate_info ORDER BY OPERATE_TIME DESC LIMIT 10 OFFSET 5000  ) T2 ON T1.ID = T2.ID;

查询分析

MySQL分页查询详解:优化大数据集的LIMIT和OFFSET_mysql_02

通过查询分析对比,优化后的sql扫描的数据行数更少,查询可能会更加高效,所以我们可以考虑用这种方式对大偏移量的limit 进行优化。

总结

MySQL的分页查询是处理大量数据集的常见需求,了解LIMITOFFSET关键字的用法可以帮助您有效地实现分页功能。同时,性能优化也是确保查询高效执行的关键。通过合理配置和结合其他优化策略,您可以轻松应对分页查询的挑战,提供更好的用户体验。


标签:info,10,分页,OFFSET,查询,LIMIT,MySQL
From: https://blog.51cto.com/xiuji/7377975

相关文章

  • MySQL 存储引擎 有几种 都有什么优缺点?
    MySQL常见的三种存储引擎为InnoDB、MyISAM和MEMORY。它们各自有一些优缺点:1.InnoDB存储引擎:优点:-提供了事务管理、回滚、崩溃修复能力、和多版本并发控制的事务安全;-支持外键约束,提高了数据的一致性和完整性;-支持行级锁,提高了并发性能;-支持外键约束,提高了数据的一致性和......
  • Mysql 引擎 InnoDB和MyISAM的区别
    1、InnoDB、MyISAM区别MySQL引擎InnoDB和MyISAM是MySQL中常用的两种存储引擎,它们具有以下不同的特点:InnoDB支持事务,而MyISAM不支持事务。InnoDB支持行级锁定,而MyISAM支持表级锁定。在并发访问的情况下,InnoDB的性能更好。InnoDB支持外键约束,而MyISAM不支持......
  • dotnet 将任意时区的 DateTimeOffset 转换为中国时区时间文本
    本文告诉大家在拿到任意时区的DateTimeOffset对象,将DateTimeOffset转换为使用中国的+8时区表示的时间在开始之前,需要说明的是,采用DateTimeOffset会比DateTime更优的一个点是DateTimeOffset是带上时区的,这就意味着方便的在多个不同的时区进行传递和序列化的时候,不会丢......
  • mysql忘记密码
    mysql-uroot-p一回车想输入密码,发现密码错误!![MySQLforLinux错误ERROR1045(28000):Accessdeniedforuser'root'@'localhost'(usingpassword:YES)]1、找到my.cnf配置文件的位置windows下修改的是my.ini,这里主要说的是Linux的具体操作,Linux系统使用whereis能......
  • MySQL安装--rpm(CentOS7 + MySQL 5.7.35)
    Linux系统-部署-运维系列导航 MySQL常用安装方式有3种:rpm安装、yum安装、二进制文件安装。本文介绍rpm安装方式。 组件安装操作步骤参考 组件安装部署手册模板,根据不同组件的安装目标,部分操作可以省略。本文将按照该参考步骤执行。 一、获取组件可执行程序库,包括主程......
  • 2,mysql的常用查询语句
    一、数据库1,创建数据库createdatabasedatabase_name;数据库的Name的命名一般按照公司规范,例如:createdatabasedb_book;2,查看数据库Showdatabases;3,删除数据库Dropdatabasedatabase_name;例如:Dropdatabasedb_book;二、表结构的增删改1.,创建一个表C......
  • MySQL入门系列2-数据控制语言(DCL)
    一、概念DCL数据控制语言,用来管理数据库用户、控制数据库的访问权限。二、查询用户select*frommysql.user;其中Host代表当前用户访问的主机,如果为localhost,代表只能够在当前本机访问,不可以远程访问的。User代表的是访问该数据库的用户名。在MySQL中需要通过Host和User来唯......
  • 1,mysql基础:mysql的安装,mysql的基本数据类型
    第一章安装1,windows安装https://dev.mysql.com/downloads/mysql/如果是msi的安装包,一步步安装就可以,如果是zip包,解压后需要设置在存在有bin文件夹的同目录新建一个my.ini文件加入一下代码:[mysqld]#设置3306端口port=3306#设置mysql的安装目录basedir=C:\ProgramFi......
  • Qt调用 mysql数据库 QSqlQuery::exec()堵塞
    RT,因为某个字段名称写错了,修改字段语句,语句大致如下altertablet_user_settingchangefield1field2varchar(32)default'11'comment'22'每当执行到query.exec()时,直接堵塞不动,刚好我这里使用workbench查看数据库,在workbench调用同样语句,程序就不堵塞了,每次都是这样。最......
  • Windows下Mysql完全卸载教程
    1,windows系统(快捷键win+r)进入命令行输入:netstopmysql2,进入控制面板,卸载mysql3,进入C:\ProgramFiles(x86),C:\ProgramFiles,C:\ProgramData中,将MySQL文件夹删除4,在注册表中彻底清除mysql的东西快捷键win+r输入regedit进入注册表找到HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Ser......