SQL 分页查询详解

在处理大型数据集时,分页查询是一种常见的技术,用于将数据分成多个小块,以便逐步加载和显示。这不仅可以提高应用的性能,还可以提升用户体验,避免一次性加载过多数据导致页面加载缓慢或资源消耗过大。本文将详细介绍 SQL 分页查询的基本概念、实现方法以及一些优化技巧。

1. 分页查询的基本概念

分页查询是指将一个大的结果集分成多个较小的部分,每次只加载一部分数据。通常,分页查询会涉及两个参数:

  • 页码(Page Number):当前需要加载的页数。
  • 每页大小(Page Size):每页包含的记录数。

分页查询的基本思想是通过 SQL 语句限制返回的记录数,并跳过前几页的记录数。例如,如果我们想要获取第 2 页的数据,每页显示 10 条记录,那么我们需要跳过第 1 页的 10 条记录,从第 11 条记录开始获取 10 条记录。

2. 分页查询的实现方法
2.1 使用 LIMIT 和 OFFSET(MySQL、PostgreSQL)

在 MySQL 和 PostgreSQL 中,可以使用 LIMIT 和 OFFSET 关键字来实现分页查询。LIMIT 用于限制返回的记录数,OFFSET 用于跳过前面的记录数。

-- 获取第 2 页的数据,每页 10 条记录
SELECT * FROM table_name
LIMIT 10 OFFSET 10;

在这个查询中,LIMIT 10 表示每页显示 10 条记录,OFFSET 10 表示跳过前 10 条记录,从第 11 条记录开始获取。

2.2 使用 ROW_NUMBER()(SQL Server、Oracle、PostgreSQL)

在 SQL Server、Oracle 和 PostgreSQL 中,可以使用 ROW_NUMBER() 函数来实现分页查询。ROW_NUMBER() 为每行数据生成一个唯一的行号,然后通过行号来筛选出当前页的数据。

-- 获取第 2 页的数据,每页 10 条记录(SQL Server)
SELECT * FROM (SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS RowNumFROM table_name
) AS t
WHERE t.RowNum BETWEEN 11 AND 20;

在这个查询中,ROW_NUMBER() OVER (ORDER BY id) 为每行数据生成一个行号,外层查询通过 BETWEEN 来筛选出第 11 到第 20 条记录。

2.3 使用 FETCH 和 OFFSET(SQL Server 2012+)

在 SQL Server 2012 及以上版本中,可以使用 OFFSET 和 FETCH 关键字来实现分页查询。

-- 获取第 2 页的数据,每页 10 条记录(SQL Server 2012+)
SELECT * FROM table_name
ORDER BY id
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

在这个查询中,OFFSET 10 ROWS 表示跳过前 10 条记录,FETCH NEXT 10 ROWS ONLY 表示从跳过的位置开始获取 10 条记录。

3. 分页查询的优化技巧
3.1 避免使用 OFFSET 大量跳过记录

OFFSET 会导致数据库在跳过大量记录时性能下降,因为它需要逐行扫描并跳过指定的记录数。对于大数据集,这种方法可能会非常慢。

3.2 使用键值分页(Keyset Pagination)

键值分页通过使用一个或多个索引列的值来定位下一页的数据,而不是依靠 OFFSET。这种分页方法在性能上更为优越,因为它避免了逐行扫描。

例如,假设我们有一个按 id 排序的表:

-- 获取第 2 页的数据,每页 10 条记录(键值分页)
SELECT * FROM table_name
WHERE id > (SELECT id FROM table_name ORDER BY id LIMIT 1 OFFSET 10)
ORDER BY id
LIMIT 10;

在这个查询中,内层查询通过 LIMIT 1 OFFSET 10 获取第 11 条记录的 id,外层查询则从这个 id 开始获取 10 条记录。

3.3 使用游标(Cursor Pagination)

游标分页类似于键值分页,但它使用一个游标来记录当前的位置。游标分页通常在不支持键值分页的数据库中使用。

例如,假设我们使用 MySQL 8.0 及以上版本:

-- 获取第 2 页的数据,每页 10 条记录(游标分页)
SELECT * FROM table_name
WHERE id > (SELECT id FROM table_name WHERE id = (SELECT id FROM table_name LIMIT 1 OFFSET 10) LIMIT 1)
ORDER BY id
LIMIT 10;

在这个查询中,内层查询通过 LIMIT 1 OFFSET 10 获取第 11 条记录的 id,然后外层查询从这个 id 开始获取 10 条记录。

3.4 索引优化

确保用于分页查询的列上有适当的索引。例如,如果你按 id 列进行分页查询,确保 id 列上有索引。索引可以显著提高查询性能,尤其是在大数据集上。

3.5 使用缓存

对于经常访问的分页数据,可以使用缓存来减少数据库的负担。将分页数据缓存到内存或缓存系统中,可以大大提高查询速度。

4. 分页查询的注意事项
  • 数据一致性和并发性:在分页查询时,要注意数据的一致性和并发性问题。特别是在数据频繁变化的场景下,确保分页查询的结果是正确的。
  • 排序稳定性:使用稳定的排序方法,确保分页查询的结果在不同时间点是可预测的。例如,可以使用 ORDER BY id 来确保排序的稳定性。
  • 性能监控:定期监控分页查询的性能,及时发现并解决潜在的性能问题。
5. 分页查询的示例

假设我们有一个 users 表,包含以下字段:idusernameemailcreated_at。我们希望按 id 进行分页查询,每页显示 10 条记录。

5.1 使用 LIMIT 和 OFFSET(MySQL)
-- 获取第 2 页的数据,每页 10 条记录
SELECT id, username, email, created_at
FROM users
ORDER BY id
LIMIT 10 OFFSET 10;

5.2 使用 ROW_NUMBER()(SQL Server)
-- 获取第 2 页的数据,每页 10 条记录
SELECT id, username, email, created_at
FROM (SELECT id, username, email, created_at, ROW_NUMBER() OVER (ORDER BY id) AS RowNumFROM users
) AS t
WHERE t.RowNum BETWEEN 11 AND 20
ORDER BY t.id;

5.3 使用 FETCH 和 OFFSET(SQL Server 2012+)
-- 获取第 2 页的数据,每页 10 条记录
SELECT id, username, email, created_at
FROM users
ORDER BY id
OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;

5.4 使用键值分页(MySQL)
-- 获取第 2 页的数据,每页 10 条记录
SELECT id, username, email, created_at
FROM users
WHERE id > (SELECT id FROM users ORDER BY id LIMIT 1 OFFSET 10)
ORDER BY id
LIMIT 10;

6. 总结

分页查询在处理大型数据集时非常有用,但需要注意性能和数据一致性问题。通过使用 LIMIT 和 OFFSETROW_NUMBER()、游标分页以及索引优化等方法,可以有效地实现和优化分页查询。

希望你喜欢这篇文章!请点关注和收藏吧。你的关注和收藏会是我努力更新的动力,祝关注和收藏的帅哥美女们今年都能暴富。如果有更多问题,欢迎随时提问

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/61796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(Keil)MDK-ARM各种优化选项详细说明、实际应用及拓展内容

参考 MDK-ARM各种优化选项详细说明、实际应用及拓展内容 本文围绕MDK-ARM优化选项,以及相关拓展知识(微库、实际应用、调试)进行讲述,希望对你今后开发项目有所帮助。 1 总述 我们所指的优化,主要两方面: 1.代码大小(Size) 2.代码性能(运行时间) 在MDK-ARM中,优…

监控报警系统的指标、规则与执行闭环

随笔 从千万粉丝“何同学”抄袭开源项目说起,为何纯技术死路一条? 数据源的统一与拆分 监控报警系统的指标、规则与执行闭环 java 老矣,尚能饭否? 一骑红尘妃子笑,无人知是荔枝来! 有所依 我们如何知道系统交易…

【数据分享】2024年我国省市县三级的住宿服务设施数量(8类住宿设施/Excel/Shp格式)

宾馆酒店、旅馆招待所等住宿服务设施的配置情况是一个城市公共基础设施完善程度的重要体现,一个城市住宿服务设施种类越丰富,数量越多,通常能表示这个城市的公共服务水平越高! 本次我们为大家带来的是我国各省份、各地级市、各区…

Hive离线数仓结构分析

Hive离线数仓结构 首先,在数据源部分,包括源业务库、用户日志、爬虫数据和系统日志,这些都是数据的源头。这些数据通过Sqoop、DataX或 Flume 工具进行提取和导入操作。这些工具负责将不同来源的数据传输到基于 Hive 的离线数据仓库中。 在离线…

搜索引擎中广泛使用的文档排序算法——BM25(Best Matching 25)

在搜索场景中,BM25能计算每个文档与查询的匹配度,从中找出最相关的文档,并按相关性高低排序展示。 要理解BM25,需要掌握以下几个关键概念: 1. 词频(Term Frequency, TF):某关键词在文…

TCP socket api详解

文章目录 netstat -nltpaccept简单客户端工具 telnet 指定服务连接connect异常处理version 1 单进程版version 2 多进程版version 3 -- 多线程版本version 4 ---- 线程池版本 应用-简单的翻译系统服务器细节write 返回值 客户端守护进程化前台和后台进程的原理Linux的进程间关系…

HP6心率血压传感器

目录 一、介绍 1、工作原理概述 2、具体实现步骤 二、HP6的通信及配置 1、通信接口 2、器件地址/命令 3、校验 三、程序设计 ①IIC通信相关基础函数 ②HP6相关基础函数 一、介绍 HP6心率血压传感器的原理主要基于光电容积脉搏波描记法(PPG)&…

鸿蒙开发-音视频

Media Kit 特点 一般场合的音视频处理,可以直接使用系统集成的Video组件,不过外观和功能自定义程度低Media kit:轻量媒体引擎,系统资源占用低支持音视频播放/录制,pipeline灵活拼装,插件化扩展source/demu…

java: spire.pdf.free 9.12.3 create pdf

可以用windows 系统中文字体,也可以从文件夹的字体文件 /*** encoding: utf-8* 版权所有 2024 ©涂聚文有限公司* 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎* 描述:* # Author : geovindu,Geovin Du 涂…

【TEST】Apache JMeter + Influxdb + Grafana

介绍 使用Jmeter发起测试,测试结果存入Influxdb,Grafana展示你的测试结果。 环境 windows 10docker desktopJDK17 安装 Apache JMeter 访问官网(Apache JMeter - Apache JMeter™)下载JMeter(目前最新版本5.6.3&a…

基于python的长津湖评论数据分析与可视化,使用是svm情感分析建模

引言 研究背景及意义 上世纪初开始,中国电影就以自己独有的姿态登上了世界电影史的舞台。中国电影作为国家文化和思想观念的反映与延伸,能够增强文化自信,在文化输出方面有着极其重要的作用1[1]。 改革开放以来,随着生产力的提高…

表格数据处理中大语言模型的微调优化策略研究

论文地址 Research on Fine-Tuning Optimization Strategies for Large Language Models in Tabular Data Processing 论文主要内容 这篇论文的主要内容是研究大型语言模型(LLMs)在处理表格数据时的微调优化策略。具体来说,论文探讨了以下…

Linux入门系列--文件与目录

一、介绍 在Linux中,有着一句话,叫做:一切皆文件。也就是任何东西都是以文件的形式存储的。 目录结构 bin:全程binary,含义是二进制。该目录中存储的都是一些二进制文件。我们学过C/C,其实也都知道机器能…

【创建型设计模式】工厂模式

【创建型设计模式】工厂模式 创建型设计模式第二期!本期介绍简单工厂模式和工厂方法模式。 简单工厂模式 简单工厂模式(又叫作静态工厂方法模式),其属于创建型设计模式,简单工厂模式不属于设计模式中的 23 种经典模…

RabbitMQ和RocketMQ相关面试题

RabbitMQ和RocketMQ面试题 RabbitMQ1.RabbitMQ各部分角色2.如何确保RabbitMQ消息的可靠性?3.什么样的消息会成为死信?4.死信交换机的使用场景是什么?5.TTL6.延迟队列7.消息堆积问题8.MQ集群 RocketMQ1.RocketMQ各部分角色2.RocketMQ如何保证高…

基于LLama_factory的Qwen2.5大模型的微调笔记

Qwen2.5大模型微调记录 LLama-facrotyQwen2.5 模型下载。huggingface 下载方式Modelscope 下载方式 数据集准备模型微调模型训练模型验证及推理模型导出 部署推理vllm 推理Sglang 推理 LLama-facroty 根据git上步骤安装即可,要求的软硬件都装上。 llama-factory运行…

Linux系统Docker部署开源在线协作笔记Trilium Notes与远程访问详细教程

目录 ⛳️推荐 前言 1. 安装docker与docker-compose 2. 启动容器运行镜像 3. 本地访问测试 4.安装内网穿透 5. 创建公网地址 6. 创建固定公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…

Spark——安装步骤详细教程

1、安装步骤 1、上传 cd /opt/modules 2、解压 tar -zxf spark-3.1.2-bin-hadoop3.2.tgz -C /opt/installs 3、重命名 cd /opt/installs mv spark-3.1.2-bin-hadoop3.2 spark-local 4、创建软链接 ln -s spark-local spark 5、配置环境变量: vi /etc/prof…

Vue第一篇:组件模板总结

前言 本文希望读者有一定的Vue开发经验&#xff0c;样例采用vue中的单文件组件&#xff0c;也是我的个人笔记&#xff0c;欢迎一起进步 必须有根元素 这是一个最简单的vue单文件组件&#xff0c;<template></template>被称为模板&#xff0c;模板中必须有一个根元素…

MacOS通过X11转发远程运行virt-manager进行虚机分配

今天需要通过本地macbook机器连接远程物理机&#xff0c;执行虚机分配&#xff0c;现有文档仅提供window环境安装&#xff0c;如下整理Mac环境下的安装步骤 操作篇 前提条件 支持x11转发的terminal&#xff0c;我本地使用iTerm2&#xff1b;本地安装XQuartz&#xff0c;作为…