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
表,包含以下字段:id
、username
、email
、created_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
和 OFFSET
、ROW_NUMBER()
、游标分页以及索引优化等方法,可以有效地实现和优化分页查询。
希望你喜欢这篇文章!请点关注和收藏吧。你的关注和收藏会是我努力更新的动力,祝关注和收藏的帅哥美女们今年都能暴富。如果有更多问题,欢迎随时提问
相关文章:
SQL 分页查询详解
在处理大型数据集时,分页查询是一种常见的技术,用于将数据分成多个小块,以便逐步加载和显示。这不仅可以提高应用的性能,还可以提升用户体验,避免一次性加载过多数据导致页面加载缓慢或资源消耗过大。本文将详细介绍 S…...
ACP科普:风险价值矩阵
风险价值矩阵(Risk-Value Matrix)是一种常用的工具,用于在项目管理中帮助团队识别、评估和优先处理风险。它通过将风险和价值两个因素进行结合,帮助决策者明确哪些风险需要优先关注和处理,从而有效地管理项目的不确定性…...
计算机网络socket编程(2)_UDP网络编程实现网络字典
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 计算机网络socket编程(2)_UDP网络编程实现网络字典 收录于专栏【计算机网络】 本专栏旨在分享学习计算机网络的一点学习笔记,欢迎大家在评论区交流讨…...
(Keil)MDK-ARM各种优化选项详细说明、实际应用及拓展内容
参考 MDK-ARM各种优化选项详细说明、实际应用及拓展内容 本文围绕MDK-ARM优化选项,以及相关拓展知识(微库、实际应用、调试)进行讲述,希望对你今后开发项目有所帮助。 1 总述 我们所指的优化,主要两方面: 1.代码大小(Size) 2.代码性能(运行时间) 在MDK-ARM中,优…...
mac2024 安装node和vue
以下是使用 Node.js 官方 .pkg 安装包 安装 Node.js 和 Vue CLI 的完整流程,包括如何重新设置 npm 的环境,以避免权限问题。 安装 Node.js 步骤 1.1:下载 Node.js 安装包 1. 打开 Node.js 官网。 2. 下载 LTS(长期支持…...
在win10环境部署opengauss数据库(包含各种可能遇到的问题解决)
适用于windows环境下通过docker desktop实现opengauss部署,请审题。 文章目录 前言一、部署适合deskdocker的环境二、安装opengauss数据库1.配置docker镜像源2.拉取镜像源 总结 前言 注意事项:后面docker拉取镜像源最好电脑有科学上网工具如果没有科学上…...
Docker1:认识docker、在Linux中安装docker
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
鸿蒙开发-音视频
Media Kit 特点 一般场合的音视频处理,可以直接使用系统集成的Video组件,不过外观和功能自定义程度低Media kit:轻量媒体引擎,系统资源占用低支持音视频播放/录制,pipeline灵活拼装,插件化扩展source/demu…...
Vue3学习笔记
目录 Vue3Vue3优势Vue3组合式API & Vue2选项式APIcreate-vue使用create-vue创建项目 项目目录和关键文件组合式API-setup选项组合式API-reactive和ref函数reactive()ref() 组合式API-computed组合式API-watch基础使用immdiate和deep配置精确侦听对象的某个属性 组合式API-生…...
node + Redis + svg-captcha 实现验证码
目录 前提说明 Redis链接与封装 svg-captcha使用步骤 封装中间件验证 前端接收 扩展【svg API】 svgCaptcha.create(options) svgCaptcha.createMathExpr(options) svgCaptcha.loadFont(url) svgCaptcha.options svgCaptcha.randomText([size|options]) svgCaptcha(…...
dubbo-go框架介绍
框架介绍 什么是 dubbo-go Dubbo-go 是 Apache Dubbo 的 go 语言实现,它完全遵循 Apache Dubbo 设计原则与目标,是 go 语言领域的一款优秀微服务开发框架。dubbo-go 提供: API 与 RPC 协议:帮助解决组件之间的 RPC 通信问题&am…...
玛哈特矫平机:工业制造中的平整利器
在日新月异的工业制造领域,每一个细节都至关重要。而在这其中,矫平机以其独特的功能和卓越的性能,成为了不可或缺的重要工具。它就像一位技艺高超的工匠,精心雕琢着每一件工业产品,赋予它们平整、光滑的表面。 矫平机…...
IDEA 2024安装指南(含安装包以及使用说明 cannot collect jvm options 问题 四)
汉化 setting 中选择插件 完成 安装出现问题 1.可能是因为之前下载过的idea,找到连接中 文件,卸载即可。...
Jmeter中的定时器
4)定时器 1--固定定时器 功能特点 固定延迟:在每个请求之间添加固定的延迟时间。精确控制:可以精确控制请求的发送频率。简单易用:配置简单,易于理解和使用。 配置步骤 添加固定定时器 右键点击需要添加定时器的请求…...
共享单车管理系统项目学习实战
前言 Spring Boot Vue前后端分离 前端:Vue(CDN) Element axios(前后端交互) BaiDuMap ECharts(图表展示) 后端:Spring Boot Spring MVC(Web) MyBatis Plus(数据库) 数据库:MySQL 验证码请求 git提交 cd C:/Users/Ustini…...
学Linux的第九天--磁盘管理
目录 一、磁盘简介 (一)、认知磁盘 (1)结构 (2)物理设备的命名规则 (二)、磁盘分区方式 MBR分区 MBR分区类型 扩展 GPT格式 lsblk命令 使用fdisk管理分区 使用gdisk管理分…...
CLIP-Adapter: Better Vision-Language Models with Feature Adapters 论文解读
abstract 大规模对比视觉-语言预训练在视觉表示学习方面取得了显著进展。与传统的通过固定一组离散标签训练的视觉系统不同,(Radford et al., 2021) 引入了一种新范式,该范式在开放词汇环境中直接学习将图像与原始文本对齐。在下游任务中,通…...
D74【 python 接口自动化学习】- python 基础之HTTP
day74 http基础定义 学习日期:20241120 学习目标:http定义及实战 -- http基础介绍 学习笔记: HTTP定义 HTTP 是一个协议(服务器传输超文本到浏览器的传送协议),是基于 TCP/IP 通信协议来传递数据&…...
维护表空间和数据文件(一)
学习目标 定义表空间和数据文件的用途创建表空间管理表空间使用Oracle管理文件(OMF)创建和管理表空间获取表空间信息 表空间和数据文件 Oracle逻辑上将数据存储在表空间中,物理上将数据存储在数据文件中。 Tablespaces: 一次只…...
H.265流媒体播放器EasyPlayer.js H5流媒体播放器关于如何查看手机端的日志信息并保存下来
现今流媒体播放器的发展趋势将更加多元化和个性化。人工智能的应用将深入内容创作、用户体验优化等多个方面,带来前所未有的个性化体验。 EasyPlayer.js H.265流媒体播放器属于一款高效、精炼、稳定且免费的流媒体播放器,可支持多种流媒体协议播放&#…...
Apple Vision Pro开发003-PolySpatial2.0新建项目
unity6.0下载链接:Unity 实时开发平台 | 3D、2D、VR 和 AR 引擎 一、新建项目 二、导入开发包 com.unity.polyspatial.visionos 输入版本号 2.0.4 com.unity.polyspatial(单独导入),或者直接安装 三、对应设置 其他的操作与之前的版本相同…...
解决 npm xxx was blocked, reason: xx bad guy, steal env and delete files
问题复现 今天一位朋友说,vue2的老项目安装不老依赖,报错内容如下: npm install 451 Unavailable For Legal Reasons - GET https://registry.npmmirror.com/vab-count - [UNAVAILABLE_FOR_LEGAL_REASONS] vab-count was blocked, reas…...
leetcode 面试150之 156.LUR 缓存
请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类: LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -…...
Vue 动态给 data 添加新属性深度解析:问题、原理与解决方案
在 Vue 中,动态地向 data 中添加新的属性是一个常见的需求,但它也可能引发一些问题,尤其是关于 响应式更新 和 数据绑定 的问题。Vue 的响应式系统通过 getter 和 setter 来追踪和更新数据,但 动态添加新属性 时,Vue 并不会自动为这些新属性创建响应式链接。 1. 直接向 V…...
Unity类银河战士恶魔城学习总结(P141 Finalising ToolTip优化UI显示)
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ UI部分暂时完结!!! 本章节优化了UI中物品描述的显示效果,技能描述的显示效果 并且可以批…...
面试:请阐述MySQL配置文件my.cnf中参数log-bin和binlog-do-db的作用
大家好,我是袁庭新。星球里的小伙伴去面试,面试官问:MySQL配置文件my.cnf中参数log-bin和binlog-do-db的作用?一脸懵逼~不知道该如何回答。 在MySQL的配置文件my.cnf中,log-bin和binlog-do-db是与二进制日志…...
监控报警系统的指标、规则与执行闭环
随笔 从千万粉丝“何同学”抄袭开源项目说起,为何纯技术死路一条? 数据源的统一与拆分 监控报警系统的指标、规则与执行闭环 java 老矣,尚能饭否? 一骑红尘妃子笑,无人知是荔枝来! 有所依 我们如何知道系统交易…...
玩转数字与运算:用C语言实现24点游戏的扑克牌魅力
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
动态反馈控制器(DFC)和 服务率控制器(SRC);服务率和到达率简单理解
目录 服务率和到达率简单理解 服务率 到达率 排队论中的应用 论文解析:队列等待成本动态感知控制模型 动态反馈和队列等待成本意识: 服务速率调整算法: 动态反馈控制器(DFC)和 服务率控制器(SRC) SRC公式4的原理 算力资源分配系统中的调整消耗 举例说明 服务…...
Flutter-Web首次加载时添加动画
前言 现在web上线后首次加载会很慢,要5秒以上,并且在加载的过程中界面是白屏。因此想在白屏的时候放一个加载动画 实现步骤 1.找到web/index.html文件 2.添加以下<style>标签内容到<head>标签中 <style>.loading {display: flex;…...
stl 实现非容器类型元素和容器元素比较
在 C 标准模板库(STL)中,有许多算法可以接受自定义的比较函数(Compare)。这些算法通常涉及排序、查找、合并、集合操作等场景,允许用户通过 Compare 函数指定如何比较两个元素。 自定义compare的算法 排序…...
ChatGPT 桌面版发布了,如何安装?
本章教程教大家如何进行安装。 一、下载安装包 官网地址地址:https://openai.com/chatgpt/desktop/ 支持Windows和MacOS操作系统 二、安装步骤 Windows用户下载之后,会有一个exe安装包,点击运行安装即可。 注意事项,如果Windows操…...
【动手学电机驱动】STM32-FOC(8)MCSDK Profiler 电机参数辨识
STM32-FOC(1)STM32 电机控制的软件开发环境 STM32-FOC(2)STM32 导入和创建项目 STM32-FOC(3)STM32 三路互补 PWM 输出 STM32-FOC(4)IHM03 电机控制套件介绍 STM32-FOC(5&…...
JavaWeb后端开发知识储备2
目录 1.HttpClient 2.微信小程序开发 3.Spring Cache 4.Spring Task 4.1cron表达式 4.2入门案例 1.HttpClient 简单来说,HttpClient可以通过编码的方式在Java中发送Http请求 2.微信小程序开发 微信小程序的开发本质上是前端开发,对于后端程序员来…...
Java Stream API - 高效数据处理的核心工具_01
文章目录 概述:高效数据处理的核心工具1. 流的创建1.1 从集合创建流1.2 从数组创建流1.3 直接创建流 2. 中间操作:流的转换和处理2.1 map():映射操作2.2 filter():过滤操作2.3 flatMap():扁平化映射操作2.4 sorted()&a…...
【计算机网络】网段划分
一、为什么有网段划分 IP地址 网络号(目标网络) 主机号(目标主机) 网络号: 保证相互连接的两个网段具有不同的标识 主机号: 同一网段内,主机之间具有相同的网络号,但是必须有不同的主机号 互联网中的每一台主机,都要隶属于某一个子网 -&…...
HTML和CSS 表单、表格练习
HTML和CSS 表格练习 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>HTML表格练习</title>…...
ByteBuffer模拟拆包输出消息字符串
以下代码模拟网络编程中的粘包现象,用\n进行分割消息块 源码 public static void main(String[] args) {ByteBuffer byteBuffer1 ByteBuffer.allocate(60) ;byteBuffer1.put("Hello World\nWhat is you name?\nI am Licky!\nHo".getBytes());splice(byt…...
Java FastJson 踩坑记录
newtonsoft.json 第一次用。java 转的json给newtonsoft.json解析,一直解析不出来。 直到写这个文章的时候,我都还觉得是newtonsoft.json和fastjson都有问题。 先看java JSONField(name"RankValue") public long Rank11000; JSONField(na…...
深入理解 Java 阻塞队列:使用场景、原理与性能优化
在并发编程中,线程安全的队列是解决线程间任务传递和调度的关键工具之一。阻塞队列(BlockingQueue)作为一种线程安全的队列,实现了在并发环境下对共享数据的安全访问,广泛应用于生产者-消费者模型、任务调度和多线程计…...
Python常用高阶函数:map()、filter()、reduce()
Python常用高阶函数:map()、filter()、reduce() 高阶函数是一类以函数作为参数或者返回值的函数,能够显著提高代码的简洁性和灵活性。在Python中,map()、filter()和reduce()是三种非常常用的高阶函数,它们常被用来对列表或其他可…...
多目标优化算法:多目标极光优化算法(MOPLO)求解ZDT1、ZDT2、ZDT3、ZDT4、ZDT6,提供完整MATLAB代码
一、极光优化算法 极光优化算法(Polar Lights Optimization, PLO)是2024年提出的一种新型的元启发式优化算法,它从极光这一自然现象中汲取灵感。极光是由太阳风中的带电粒子在地球磁场的作用下,与地球大气层中的气体分子碰撞而产…...
【大数据学习 | Spark-Core】关于distinct算子
只有shuffle类的算子能够修改分区数量,这些算子不仅仅存在自己的功能,比如分组算子groupBy,它的功能是分组但是却可以修改分区。 而这里我们要讲的distinct算子也是一个shuffle类的算子。即可以修改分区。 scala> val arr Array(1,1,2,…...
ShuffleNet:一种为移动设备设计的极致高效的卷积神经网络
摘要 https://arxiv.org/pdf/1707.01083 我们介绍了一种名为ShuffleNet的计算效率极高的卷积神经网络(CNN)架构,该架构专为计算能力非常有限的移动设备(例如10-150 MFLOPs)而设计。新架构利用两种新操作:逐…...
AIGC-------AIGC在社交媒体内容生成中的应用
AIGC在社交媒体内容生成中的应用 引言 随着人工智能生成内容(AIGC)的快速发展,社交媒体平台上的内容创作方式发生了巨大变化。AIGC使得内容创作的门槛大大降低,从而让更多的人能够参与到社交媒体内容的创作中,同时也使…...
提取图像中的高频信息
三种方法 1. 傅里叶变换提取高频和低频【有损】2. 傅里叶变换提取振幅和相位【无损】3. 小波变换【不涉及恢复代码】代码1.代码2代码3 1. 傅里叶变换提取高频和低频【有损】 环境:集群210.30.98.11效果: 2. 傅里叶变换提取振幅和相位【无损】 环境:集…...
js函数声明
在 JavaScript 中,函数是一等公民(first-class citizen),这意味着函数可以作为变量、参数和返回值使用。JavaScript 提供了多种定义函数的方式,以下是几种常见的方法: 1. 函数声明(Function De…...
语言模型中的多模态链式推理
神经网络的公式推导 简介摘要引言多模态思维链推理的挑战多模态CoT框架多模态CoT模型架构细节编码模块融合模块解码模块 实验结果运行代码补充细节安装包下载Flan-T5数据集准备rougenltkall-MiniLM-L6-v2运行 简介 本文主要对2023一篇论文《Multimodal Chain-of-Thought Reason…...
【Java 解释器模式】实现高扩展性的医学专家诊断规则引擎
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
CTF之密码学(Polybius密码)
棋盘密码,也称为Polybius密码或方格密码,是一种基于替换的加密方法。以下是对棋盘密码的详细解析: 一、加密原理 棋盘密码使用一个5x5的方格棋盘,其中填充了26个英文字母(通常i和j被视为同一个字母并放在同一个格子中…...