当前位置: 首页 > news >正文

MySQL 分页查询优化

在这里插入图片描述

目录

    • 前言
    • 1. LIMIT offset, count 的性能陷阱:为什么它慢?😩
    • 2. 优化策略一:基于排序字段的“跳跃式”查询 (Seek Method) 🚀
    • 3. 优化策略二:利用子查询优化 OFFSET 扫描 (ID Subquery)
    • 4. 基础优化:为 ORDER BY 列创建索引
    • 5. 优化总页数/总记录数计算 (COUNT(*) 问题)
    • 6. EXPLAIN 分析分页查询
    • 7. 总结与选择最佳策略

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!

其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等

如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning


前言

你好呀,正在与大量数据打交道的开发者们!👋 分页,这个再寻常不过的功能,背后却隐藏着一个性能杀手——那就是 LIMIT offset, count 中不断增大的 offset 值。随着用户翻页越来越深,查询速度却越来越慢,这不仅影响用户体验,还可能给数据库带来巨大的压力。

今天,我们就来揭露 LIMIT offset, count 的性能问题,并学习几种有效的优化策略,让你的分页查询在数据量和深度增加时依然保持高性能。

1. LIMIT offset, count 的性能陷阱:为什么它慢?😩

我们常用的分页查询语句通常长这样:

SELECT * FROM articles ORDER BY publish_time DESC LIMIT 10000, 10; -- 查找第 10001 到 10010 条记录

这条语句的意图很明确:跳过前面 10000 条记录,然后返回接下来的 10 条。

问题就出在这个 offset (10000) 上。

MySQL 在处理 LIMIT offset, count 时,如果不借助优化手段,它的基本行为是:

  1. 首先,找到所有符合 WHERE 条件(如果没有 WHERE 就是全表)的记录。
  2. 然后,对这些记录进行 ORDER BY 排序(如果 ORDER BY 的列没有合适的索引,这里还会发生 Using filesort,进一步加剧性能问题)。
  3. 接下来,跳过前 offset 条记录! MySQL 必须把这些记录一条条地读出来,然后再把它们抛弃掉。
  4. 最后,返回接下来的 count 条记录。

想象一下,如果 offset 是 100万,count 是 10。数据库需要找到并排序至少 100万零 10 条记录,然后丢弃掉 100万条,只返回最后的 10条。这前 100万条记录的读取和处理,就是白白浪费的性能开销! 而且 offset 越大,浪费的开销就越大,查询就越慢。这就是深层分页的痛点。

EXPLAIN 中,虽然 LIMIT 子句会体现在执行计划中,但你无法直接从 rows 这一列看出 offset 带来的巨大开销。rows 显示的是优化器预估需要扫描的行数,而不是实际跳过的行数。LIMIT 的影响体现在它强制优化器必须找到 offset + count 条记录才能结束扫描。

2. 优化策略一:基于排序字段的“跳跃式”查询 (Seek Method) 🚀

这是最常用且效果最好的优化方法,特别是对于只能一页一页往后翻(或往前翻)的场景。它的核心思想是:不再使用 OFFSET 跳过,而是记录上一页最后一条记录的排序字段值,然后通过 WHERE 条件直接定位到下一页的起始位置。

适用场景:

  • 你希望实现“下一页”、“上一页”这样的分页导航,而不是直接跳转到任意页码。
  • 你的排序字段(或联合排序字段)是有索引的。

原理:

假设你按照 id 升序排序,每页显示 10 条记录。

  • 第一页: SELECT * FROM articles ORDER BY id ASC LIMIT 10;
    • 获取第一页的 10 条记录,并记住最后一条记录的 id 值,比如是 10
  • 第二页: 不再使用 LIMIT 10, 10。而是使用上一页最后的 id 值作为起点:
    • SELECT * FROM articles WHERE id > 10 ORDER BY id ASC LIMIT 10;
    • MySQL 可以直接利用 id 索引,快速找到 id > 10 的第一条记录,然后顺序扫描索引和数据行,直到找到 10 条记录为止。完全避免了扫描和丢弃前 10 条记录的开销。
  • 第三页: 记住第二页最后一条记录的 id 值,比如是 20。查询:
    • SELECT * FROM articles WHERE id > 20 ORDER BY id ASC LIMIT 10;

以此类推,无论翻到多深,每一页的查询都只基于上一页的终点进行简单的索引查找和顺序扫描 count 条记录,性能非常稳定,不受 offset 影响。

处理非唯一排序字段:

如果你的排序字段不是唯一的(比如按发布时间 publish_time 排序,可能同一时间发布多篇文章),仅仅使用 WHERE publish_time > last_time 是不够的,可能会漏掉或重复记录。这时需要增加一个次级排序字段作为“决胜”条件,通常是主键 ID:

假设按 publish_time 倒序,然后按 id 倒序(确保唯一性),每页 10 条。

  • 第一页: SELECT * FROM articles ORDER BY publish_time DESC, id DESC LIMIT 10;
    • 获取第一页数据,记住最后一条记录的 publish_timeid,比如是 ('2024-05-07 10:00:00', 120)
  • 第二页: WHERE 条件需要同时考虑这两个字段:
    • SELECT * FROM articles WHERE (publish_time < '2024-05-07 10:00:00') OR (publish_time = '2024-05-07 10:00:00' AND id < 120) ORDER BY publish_time DESC, id DESC LIMIT 10;
    • 这个条件的意思是:找发布时间早于上一页最后一条的记录,或者发布时间与上一页最后一条相同但 ID 更小的记录。
    • 为了让这个 WHERE 条件高效,你需要一个覆盖 (publish_time, id) 的联合索引,且顺序和方向与 ORDER BY 匹配。

优点:

  • 性能极高,不受 offset 大小影响。
  • 避免了扫描和丢弃大量记录的开销。
  • 如果排序字段有索引,MySQL 可以高效定位起始点。

缺点:

  • 无法直接跳转到任意页码。 只能从第一页开始,一页一页往后翻(或往前翻,但 WHERE 条件和 ORDER BY 方向需要反过来)。
  • 需要客户端或应用端记录并传递上一页最后一条记录的关键字段值。
  • 需要排序字段是索引列。

EXPLAIN 对比:

  • 原始查询 EXPLAIN SELECT * FROM articles ORDER BY id LIMIT 10000, 10;rows 可能会很大(预估扫描 10010 条),Extra 可能有 Using filesort (如果 id 不是主键且没索引)。
  • 优化后查询 EXPLAIN SELECT * FROM articles WHERE id > 10000 ORDER BY id LIMIT 10;rows 会小很多(预估扫描 10 条,因为 WHERE 条件已经缩小了范围),type 可能是 rangeExtra没有 Using filesort

3. 优化策略二:利用子查询优化 OFFSET 扫描 (ID Subquery)

如果你需要支持用户直接跳转到任意页码,或者排序字段没有合适的索引(虽然强烈建议为排序字段建索引!),可以考虑这种方法。它的核心是先在一个子查询中查出当前页的行的主键 ID,然后在外层查询中根据这些 ID 去获取完整的行数据。

原理:

SELECT t1.*
FROM articles t1
JOIN (SELECT idFROM articlesORDER BY publish_time DESCLIMIT 10000, 10 -- 在子查询中进行低成本的 OFFSET 扫描
) as t2 ON t1.id = t2.id
ORDER BY t2.publish_time DESC; -- 注意:如果外层需要保持排序,这里可能需要再次 ORDER BY-- 或者如果子查询的 ORDER BY 列已经包含在 SELECT id 中,可以直接用 t2 的列排序

解释:

  1. 子查询 (SELECT id FROM articles ORDER BY publish_time DESC LIMIT 10000, 10)
    • 这个子查询仍然使用了 LIMIT offset, count,会扫描并丢弃前 offset 条记录。
    • 但它只查询了主键 ID。主键 ID 通常很小,且主键本身就是索引。相比于查询整个宽行并进行排序,只查询和排序 ID 列表的开销要小得多。
    • 如果 ORDER BY publish_time DESC 可以利用 publish_time 的索引,那么子查询的速度会更快(避免 Filesort)。
  2. 外层查询 SELECT t1.* FROM articles t1 JOIN ... ON t1.id = t2.id
    • 外层查询根据子查询返回的少数(10个)ID,通过主键索引 (id) 去 articles 表中精确地找到并获取这 10 行完整的记录。这是高效的等值 JOIN。
    • 最后的 ORDER BY t2.publish_time DESC 确保结果集按照正确的顺序返回。如果 publish_time 也在子查询的 SELECT 列表中,可以直接用 t2.publish_time 排序。

优点:

  • 支持跳转到任意页码。
  • 相比直接对全行进行 LIMIT offset, count,子查询对更小的 ID 集合进行 OFFSET 扫描和排序,性能有所提升(尤其当原始表的行很宽,或者 ORDER BY 的列没有索引时)。

缺点:

  • 性能仍然会随着 offset 增大而下降,只是下降的速度可能比直接 LIMIT offset, count 慢。
  • SQL 语句更复杂。
  • 引入了 JOIN 的开销。

EXPLAIN 分析:

EXPLAIN 这个子查询 JOIN 语句,你会看到子查询 (DERIVED) 的执行计划,它会显示 LIMIT 和可能的 Filesort (如果 publish_time 没索引)。外层 JOIN 会显示通过 id 进行 JOIN 的类型(通常是 eq_refref)。

4. 基础优化:为 ORDER BY 列创建索引

无论你选择哪种分页策略,ORDER BY 子句中使用的列创建索引都是至关重要的一步。

  • 如果你的 ORDER BY 列没有索引,MySQL 就会进行 Using filesort,这本身就是一个巨大的性能开销。分页只会加剧这个开销,因为它需要对 offset + count 这么多行进行排序。
  • 如果 ORDER BY 列有索引,MySQL 可以避免 Filesort,直接按照索引顺序读取数据。这使得上面的策略一成为可能,也使得策略二中的子查询更快。

请回顾之前关于 ORDER BY 优化的部分,确保你的排序字段有合适的索引,特别是联合索引的列顺序和方向。

5. 优化总页数/总记录数计算 (COUNT(*) 问题)

分页界面通常需要显示总记录数或总页数。计算这个值通常需要执行一个独立的 SELECT COUNT(*) 语句,而且这个语句需要和分页查询使用相同的 WHERE 条件。

SELECT COUNT(*) FROM articles WHERE status = 'published';

对于大表,COUNT(*) 也可能非常慢,因为它通常需要扫描大量数据(至少是索引)。频繁执行这个查询会给数据库带来压力。

优化 COUNT(*) 的策略:

  • 牺牲精确性,提供估算值: 告诉用户“大约有xxx条记录”,而不是精确数字。可以使用 EXPLAIN SELECT ...rows 估算值(不准确),或者维护一个近似的计数器。
  • 限制总页数: 只显示前几十页或前一百页的页码,更深的页只提供“下一页”按钮。这样可以避免计算一个巨大的 COUNT(*) 值。
  • 异步加载计数: 先加载数据,后在后台异步计算总数。
  • 缓存计数: 将计数结果缓存一段时间,而不是每次都实时查询。
  • 维护计数器表: 对于非常频繁且需要精确计数的场景,可以考虑通过触发器或业务逻辑维护一个独立的计数器表。
  • SQL_CALC_FOUND_ROWSFOUND_ROWS() (谨慎使用): 这是一个 MySQL 特性,在执行完 LIMIT 查询后,可以通过 SELECT FOUND_ROWS() 获取如果没有 LIMIT 的总行数。看起来很方便,但底层实现并不总是高效(尤其在 InnoDB 中),它可能还是需要扫描大量行来确定总数。在很多情况下,单独执行一个优化好的 COUNT(*)(可能利用覆盖索引)会比 SQL_CALC_FOUND_ROWS 更快。通常不推荐在新的设计中使用它。

选择哪种策略取决于你的业务需求和对精确度的要求。 对于大多数用户来说,知道有“下一页”或者一个大致的数字就足够了,不需要精确到个位的总数。

6. EXPLAIN 分析分页查询

在优化分页查询时,EXPLAIN 是必不可少的工具。

  • 分析原始查询 (LIMIT offset, count): 查看 type, key, rows, Extra。特别关注 Extra 中的 Using filesortrows 的大小。rows 会告诉你为了得到这 count 行,优化器预估扫描了多少行,这个数字通常接近 offset + count 或更多。
  • 分析子查询优化方案 (JOIN (SELECT ID ... LIMIT offset, count)): 分别 EXPLAIN 外层查询和子查询。查看子查询的 type, key, rows, Extra,看看 ID 的扫描是否高效,是否有 Filesort。查看外层 JOIN 的类型和使用的索引。
  • 分析跳跃式查询方案 (WHERE sort_key > last_value LIMIT count): 查看 type ( ideally range), key, rows (应该很小,接近 count), Extra (没有 Using filesort,可能有 Using index condition 如果有额外 WHERE 条件)。

通过对比不同方案的 EXPLAIN 输出,你可以直观地看到哪种方法减少了扫描的行数,消除了 Filesort,从而提高了效率。

7. 总结与选择最佳策略

  • 首要任务: 永远为你的 ORDER BY 列创建合适的索引。这是所有高效分页的基础。
  • 首选方案(对于“下一页/上一页”导航): 使用基于索引排序字段的跳跃式查询(Seek Method)。实现方式是记录上一页最后一条记录的排序字段值,下一页查询使用 WHERE sort_key > last_value ORDER BY sort_key LIMIT count。处理非唯一排序字段时,记得加上主键作为次级排序字段和 WHERE 条件的组合判断。
  • 备选方案(对于任意页码跳转): 如果必须支持任意页码跳转,可以考虑子查询方案,先在子查询中利用索引(特别是主键或排序字段索引)快速获取当前页的 ID 列表,再 JOIN 回原表。性能优于直接 LIMIT offset, count,但仍会随 offset 增加而性能下降。
  • 优化总数: 重新评估是否需要精确的总记录数。如果不需要,考虑使用估算、限制页数或异步计算等方法,避免昂贵的 COUNT(*) 查询。
  • 实践验证: 任何优化都需要在实际环境和数据下用 EXPLAIN 和性能测试来验证效果。

分页查询的优化是一个常见但关键的环节。通过理解 LIMIT OFFSET 的原理并应用基于索引的优化策略,特别是跳跃式查询,你可以显著提升数据库的查询性能,为用户带来更流畅的体验。

希望这篇详细的讲解能够帮助你彻底理解并解决分页查询的性能问题!实战出真知,赶紧在你的项目中试试这些方法吧!💪

相关文章:

MySQL 分页查询优化

目录 前言1. LIMIT offset, count 的性能陷阱&#xff1a;为什么它慢&#xff1f;&#x1f629;2. 优化策略一&#xff1a;基于排序字段的“跳跃式”查询 (Seek Method) &#x1f680;3. 优化策略二&#xff1a;利用子查询优化 OFFSET 扫描 (ID Subquery)4. 基础优化&#xff1…...

我用Deepseek + 亮数据爬虫神器 1小时做出輿情分析器

我用Deepseek 亮数据爬虫神器 1小时做出輿情分析器 一、前言二、Web Scraper API 实战&#xff08;1&#xff09;选择对应的URL&#xff08;2&#xff09;点击进入对应url界面&#xff08;3&#xff09;API结果实例和爬取结果展示&#xff08;4&#xff09;用户直接使用post请…...

langchain4j中使用milvus向量数据库做RAG增加索引

安装milvus向量数据库 官方网址 https://milvus.io/zh 使用docker安装milvus mkdir -p /data/docker/milvus cd /data/docker/milvus wget https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh#在docker中启动milvus sh standalone_emb…...

【开源工具】深度解析:基于PyQt6的Windows时间校时同步工具开发全攻略

&#x1f552; 【开源工具】深度解析&#xff1a;基于PyQt6的Windows时间校时同步工具开发全攻略 &#x1f308; 个人主页&#xff1a;创客白泽 - CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f40d;《Python开源项目实战》 &#x1f4a1; 热爱不止于代码&#xff0c;热…...

开源 RPA 工具深度解析与官网指引

开源 RPA 工具深度解析与官网指引 摘要 &#xff1a;本文深入解析了多款开源 RPA 工具&#xff0c;涵盖 TagUI、Aibote、Taskt 等&#xff0c;分别介绍了它们的核心功能&#xff0c;并提供了各工具的官网链接&#xff0c;方便读者进一步了解与使用&#xff0c;同时给出了基于不…...

【免杀】C2免杀技术(一)VS设置

一、概述 编译器生成的二进制文件特征&#xff08;代码结构、元数据、指纹&#xff09;可能被杀软的静态或动态检测规则匹配。Visual Studio 的构建设置&#xff08;特别是运行库、编译器优化、链接方式等&#xff09;会直接影响最终生成的二进制文件的结构、行为特征和依赖关…...

OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——nettle库

准备工作 请依照这篇文章搭建环境 OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——环境配置_openharmony交叉编译-CSDN博客 编译依赖 相关依赖有 gmp-6.3.0 请依照这篇文章编译 OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库…...

Kotlin与Ktor构建Android后端API

以下是一个使用 Kotlin 和 Ktor 构建 Android 后端 API 的详细示例,包含常见功能实现: 1. 项目搭建 (build.gradle.kts) plugins {applicationkotlin("jvm") version "1.9.0"id("io.ktor.plugin") version "2.3.4"id("org.je…...

网页jupyter如何显示jpipvenv虚拟环境

今天使用社区版pycharm编辑.ipynb文件时&#xff0c;发现pycharm编辑.ipynb文件需要订阅。但是发现pipvenv虚拟环境解释器在jupyter中只有一个Python3:ipykernel版本&#xff0c;没有venv和conda的虚拟环境。因此在网上搜寻资料&#xff0c;作为备份记录。 以windows为例 假设目…...

学习黑客5 分钟深入浅出理解Windows System Configuration

5 分钟深入浅出理解Windows System Configuration ⚙️ 大家好&#xff01;今天我们将探索Windows系统配置——这是Windows操作系统的核心控制中心&#xff0c;决定了系统如何启动、运行和管理各种功能。无论你是计算机初学者&#xff0c;还是在TryHackMe等平台上学习网络安全…...

Spyglass:跨时钟域同步方案

相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 Spyglass可以用于检测设计中的跨时钟域相关问题&#xff0c;确保电路中添加了适当的同步机制&#xff0c;以避免此类问题的发生&#xff0c;例如&#xff1a; 与亚稳…...

Ubuntu虚拟机文件系统扩容

1. 删除所有的虚拟机快照。 2. 选择扩展 将最大大小调整为你所需的大小 3. 进入虚拟机&#xff0c;输入命令&#xff1a; sudo apt install gparted sudo gparted 4. 选择磁盘&#xff0c;右键根分区&#xff0c;选择Resize/Move&#xff0c;调整大小。 5. 调整所需分区大…...

Window、CentOs、Ubuntu 安装 docker

Window 版本 网址&#xff1a;https://www.docker.com/ 下载 下载完成后&#xff0c;双击安装就可以了 Centos 版本 卸载 Docker &#xff08;可选&#xff09; yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-log…...

mac M2下虚拟机CentOS 8 安装上安装 Berkeley DB

问题&#xff1a;直接在centos8 yum安装db4-devel失败&#xff0c;只能手工安装 进入home目录&#xff0c;下载 wget http://download.oracle.com/berkeley-db/db-4.6.21.tar.gz 解压 tar -zxvf db-4.6.21.tar.gz 切到cd db-4.6.21的build_unix下 cd db-4.6.21 cd build_…...

Python文字转语音TTS库示例(edge-tts)

1. 安装 pip install edge-tts2. 命令行使用 # 生成语音文件 # -f&#xff1a;要转换语音的文本文件&#xff0c;例如一个txt文件 # --text&#xff1a;指明要保存的mp3的文本 # --write-media&#xff1a;指明保存的mp3文件路径 # --write-subtitles&#xff1a;指定输出字幕…...

lua入门语法,包含安装,注释,变量,循环等

文章目录 LUA入门什么是lualua安装入门lua的使用方式注释定义变量lua中的数据类型流程控制ifelsewhile语法&#xff1a;for 函数表模块 LUA入门 什么是lua 一种脚本语言&#xff0c;设计的目的是为了能够在一些应用程序提供灵活的扩展功能和定制功能。 lua安装 有linux版本…...

【文心智能体】使用文心一言来给智能体设计一段稳定调用工作流的提示词

&#x1f339;欢迎来到《小5讲堂》&#x1f339; &#x1f339;这是《文心智能体》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。&#x1f339; &#x1f339;温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff0…...

TWASandGWAS中GBS filtering and GWAS(1)

F:\文章代码\TWASandGWAS\GBS filtering and GWAS README.TXT 请检查幻灯片“Vitamaize_update_Gorelab_Ames_GBS_filtering_20191122.pptx”中关于阿姆斯&#xff08;Ames&#xff09;ID处理流程的详细信息。 文件夹“Ames_ID_processing”包含了用于处理阿姆斯ID的文件和R…...

Linux电源管理(五),发热管理(thermal),温度控制

更多linux系统电源管理相关的内容请看&#xff1a;Linux电源管理、功耗管理 和 发热管理 (CPUFreq、CPUIdle、RPM、thermal、睡眠 和 唤醒)-CSDN博客 本文主要基于linux-5.4.18版本的内核代码进行分析。 1 简介 1.1 硬件知识 CPU等芯片在工作时会产生大量热量&#xff0c;…...

【C++11】异常

前言 上文我们学习到了C11中类的新功能【C11】类的新功能-CSDN博客 本文我们来学习C下一个新语法&#xff1a;异常 1.异常的概念 异常的处理机制允许程序在运行时就出现的问题进行相应的处理。异常可以使得我们将问题的发现和问题的解决分开&#xff0c;程序的一部分负…...

C#WPF里不能出现滚动条的原因

使用下面这段代码,就不能出现滚动条: <mdix:DrawerHost.LeftDrawerContent><Grid Width="260" Background="{StaticResource MaterialDesign.Brush.Primary}"><Grid.RowDefinitions><RowDefinition Height="auto"/>&l…...

安装Hadoop并运行WordCount程序

一、安装 Java Hadoop 依赖 Java&#xff0c;首先需要安装 Java 开发工具包&#xff08;JDK&#xff09;。以 Ubuntu 为例&#xff1a; bash sudo apt update sudo apt install openjdk-8-jdk安装后&#xff0c;设置环境变量&#xff1a; bash echo export JAVA_HOME/usr/li…...

从零搭建AI工作站:Gemma3大模型本地部署+WebUI配置全套方案

文章目录 前言1. 安装Ollama2.Gemma3模型安装与运行3. 安装Open WebUI图形化界面3.1 Open WebUI安装运行3.2 添加模型3.3 多模态测试 4. 安装内网穿透工具5. 配置固定公网地址总结 前言 如今各家的AI大模型厮杀得如火如荼&#xff0c;每天都有新的突破。今天我要给大家安利一款…...

《数字人技术实现路径深度剖析与研究报告》

《数字人技术实现路径深度剖析与研究报告》 一、引言 1.1 研究背景与意义 近年来,随着人工智能、虚拟现实、计算机图形学等技术的飞速发展,数字人技术应运而生并取得了显著进展。数字人作为一种新兴的技术应用,正逐步渗透到各个领域,成为推动行业创新发展的重要力量。从最…...

《棒球百科》MLB棒球公益课·棒球1号位

MLB&#xff08;美国职业棒球大联盟&#xff09;的棒球公益课通过推广棒球运动、普及体育教育&#xff0c;对全球多个地区产生了多层次的影响&#xff1a; 1. 体育文化推广 非传统棒球地区的普及&#xff1a;在棒球基础较弱的地区&#xff08;如中国、欧洲部分国家&#xff09…...

Android 中 Handler (创建时)内存泄漏问题及解决方案

一、Handler 内存泄漏核心原理 真题 1&#xff1a;分析 Handler 内存泄漏场景 题目描述&#xff1a; 在 Activity 中使用非静态内部类 Handler 发送延迟消息&#xff0c;旋转屏幕后 Activity 无法释放&#xff0c;分析原因并给出解决方案。 内存泄漏链路分析&#xff1a; 引…...

linux-驱动开发之设备树详解(RK平台为例)

前言 Linux3.x以后的版本才引入了设备树&#xff0c;设备树用于描述一个硬件平台的板级细节。 在早些的linux内核&#xff0c;这些“硬件平台的板级细节”保存在linux内核目录“/arch”&#xff0c; 以ARM为例“硬件平台的板级细节”保存在“/arch/arm/plat-xxx”和“/arch/ar…...

【现代深度学习技术】注意力机制05:多头注意力

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…...

RDD的五大特征

1. 由多个分区&#xff08;Partitions&#xff09;组成 特性&#xff1a;RDD 是分区的集合&#xff0c;每个分区在集群的不同节点上存储。分区是数据并行处理的基本单位。作用&#xff1a;分区使 RDD 能够在集群中并行计算&#xff0c;提高处理效率。 2. 有一个计算每个分区的…...

键盘RGB矩阵与LED指示灯(理论部分)

键盘RGB矩阵与LED指示灯(理论部分) 一、LED指示灯基础 在键盘世界里,LED指示灯不仅仅是装饰,它们还能提供丰富的状态信息。QMK固件提供了读取HID规范中定义的5种LED状态的方法: Num Lock(数字锁定)Caps Lock(大写锁定)Scroll Lock(滚动锁定)Compose(组合键)Desp…...

HTTP方法和状态码(Status Code)

HTTP方法 HTTP方法&#xff08;也称HTTP动词&#xff09;主要用于定义对资源的操作类型。根据HTTP/1.1规范&#xff08;RFC 7231&#xff09;以及后续扩展&#xff0c;常用的HTTP方法有以下几种&#xff1a; GET&#xff1a;请求获取指定资源的表示形式。POST&#xff1a;向指…...

【sqlmap需要掌握的参数】

sqlmap需要掌握的参数 目标-u 指定URL 用于get请求-l 用于post请求- r 用于post请求指定数据库/表/字段 -D/-T/-C 脱库获得数据库获取用户获取表获取列获取字段获取字段类型获取值 其他 目标 -u 指定URL 用于get请求 -u URL, --urlURL 目标URL 只使用于get命令中 -l 用于pos…...

用 AltSnap 解锁 Windows 窗口管理的“魔法”

你有没有遇到过这样的场景&#xff1a;电脑屏幕上堆满了窗口&#xff0c;想快速调整它们的大小和位置&#xff0c;却只能拖来拖去&#xff0c;费时又费力&#xff1f;或者你是个多任务狂魔&#xff0c;喜欢一边写代码、一边看文档、一边刷视频&#xff0c;却发现 Windows 自带的…...

高并发内存池(三):TLS无锁访问以及Central Cache结构设计

目录 前言&#xff1a; 一&#xff0c;thread cache线程局部存储的实现 问题引入 概念说明 基本使用 thread cache TLS的实现 二&#xff0c;Central Cache整体的结构框架 大致结构 span结构 span结构的实现 三&#xff0c;Central Cache大致结构的实现 单例模式 thr…...

数据治理域——数据治理体系建设

摘要 本文主要介绍了数据治理系统的建设。数据治理对企业至关重要&#xff0c;其动因包括应对数据爆炸增长、提升内部管理效率、支撑复杂业务需求、加强风险防控与合规管理以及实现数字化转型战略。其核心目的是提升数据质量、统一数据标准、优化数据资产管理、支撑业务发展和…...

数据库实验报告 SQL SERVER 2008的基本操作 1

实验报告&#xff08;第 1 次&#xff09; 实验名称 SQL SERVER 2008的基本操作 实验时间 9月14日1-2节 一、实验内容 数据库的基本操作:包括创建、修改、附加、分离和删除数据库等。 二、源程序及主要算法说明 本次实验不涉及程序和算法。 三、测…...

基于STM32、HAL库的ICP-20100气压传感器 驱动程序设计

一、简介: ICP-20100 是 InvenSense(TDK 集团旗下公司)生产的一款高精度数字气压传感器,专为需要精确测量气压和海拔高度的应用场景设计。它具有低功耗、高精度、快速响应等特点,非常适合物联网、可穿戴设备和无人机等应用。 二、硬件接口: ICP-20100 引脚STM32L4XX 引脚…...

提示工程实战指南:Google白皮书关键内容一文讲清

You don’t need to be a data scientist or a machine learning engineer – everyone can writea prompt. 一、概述 Google于2025年2月发布的《Prompt Engineering》白皮书系统阐述了提示工程的核心技术、实践方法及挑战应对策略。该文档由Lee Boonstra主编&#xff0c;多位…...

国产大模型「五强争霸」:决战AGI,谁主沉浮?

引言 中国AI大模型市场正经历一场史无前例的洗牌&#xff01;曾经“百模混战”的局面已落幕&#xff0c;字节、阿里、阶跃星辰、智谱和DeepSeek五大巨头强势崛起&#xff0c;形成“基模五强”新格局。这场竞争不仅是技术实力的较量&#xff0c;更是资源、人才与生态的全面博弈。…...

Linux进程10-有名管道概述、创建、读写操作、两个管道进程间通信、读写规律(只读、只写、读写区别)、设置阻塞/非阻塞

目录 1.有名管道 1.1概述 1.2与无名管道的差异 2.有名管道的创建 2.1 直接用shell命令创建有名管道 2.2使用mkfifo函数创建有名管道 3.有名管道读写操作 3.1单次读写 3.2多次读写 4.有名管道进程间通信 4.1回合制通信 4.2父子进程通信 5.有名管道读写规律&#xff…...

高吞吐与低延迟的博弈:Kafka与RabbitMQ数据管道实战指南

摘要 本文全面对比Apache Kafka与RabbitMQ在数据管道中的设计哲学、核心差异及协同方案。结合性能指标、应用场景和企业级实战案例&#xff0c;揭示Kafka在高吞吐流式处理中的优势与RabbitMQ在复杂路由和低延迟传输方面的独特特点&#xff1b;介绍了使用Java生态成熟第三方库&…...

C++23 views::slide (P2442R1) 深入解析

文章目录 引言C20 Ranges库回顾什么是Rangesstd::views的作用 views::slide 概述基本概念原型定义辅助概念工作原理代码示例输出结果 views::slide 的应用场景计算移动平均值查找连续的子序列 总结 引言 在C的发展历程中&#xff0c;每一个新版本都会带来一系列令人期待的新特…...

SpringDataRedis的入门案例,以及RedisTemplate序列化实现

目录 SpringDataRedis 简单介绍 入门案例 RedisTemplate序列化方案 方案一: 方案二: SpringDataRedis 简单介绍 提供了对不同Redis客户端的整合(Lettuce和Jedis) 提供了RedisTemplate统一API来操作Redis 支持Redis的发布订阅模型 支持Redis哨兵和Redis集群 支持基于…...

鸿蒙HarmonyOS list优化一: list 结合 lazyforeach用法

list列表是开发中不可获取的&#xff0c;非常常用的组件&#xff0c;使用过程中会需要不断的优化&#xff0c;接下来我会用几篇文章进行list在纯原生的纯血鸿蒙的不断优化。我想进大厂&#xff0c;希望某位大厂的看到后能给次机会。 首先了解一下lazyforeach&#xff1a; Laz…...

【Jenkins简单自动化部署案例:基于Docker和Harbor的自动化部署流程记录】

摘要 本文记录了作者使用Jenkins时搭建的一个简单自动化部署案例&#xff0c;涵盖Jenkins的Docker化安装、Harbor私有仓库配置、Ansible远程部署等核心步骤。通过一个SpringBoot项目 (RuoYi) 的完整流程演示&#xff0c;从代码提交到镜像构建、推送、滚动更新&#xff0c;逐步实…...

【愚公系列】《Manus极简入门》034-跨文化交流顾问:“文化桥梁使者”

&#x1f31f;【技术大咖愚公搬代码&#xff1a;全栈专家的成长之路&#xff0c;你关注的宝藏博主在这里&#xff01;】&#x1f31f; &#x1f4e3;开发者圈持续输出高质量干货的"愚公精神"践行者——全网百万开发者都在追更的顶级技术博主&#xff01; &#x1f…...

数字滤波器应用介绍

此示例说明如何设计、分析数字过滤器并将其应用于数据。它将帮助您回答以下问题: 如何补偿滤波器引入的延迟?如何避免使信号失真?如何从信号中删除不需要的内容?如何微分信号?以及积分信号文章目录 补偿筛选引入的延迟补偿恒定滤波器延迟 如FIR引起的消除方法,末尾添零补…...

木马查杀篇—Opcode提取

【前言】 介绍Opcode的提取方法&#xff0c;并探讨多种机器学习算法在Webshell检测中的应用&#xff0c;理解如何在实际项目中应用Opcode进行高效的Webshell检测。 Ⅰ 基本概念 Opcode&#xff1a;计算机指令的一部分&#xff0c;也叫字节码&#xff0c;一个php文件可以抽取出…...

栈和队列复习(C语言版)

目录 一.栈的概念 二.栈的实现 三.队列的概念 四.队列的实现 五.循环队列的实现 一.栈的概念 可以将栈抽象地理解成羽毛球桶&#xff0c;或者理解成坐直升电梯&#xff1b;最后一个进去的&#xff0c;出来时第一个出来&#xff0c;并且只有一个出入口。这边需要注意的是&am…...

SDK does not contain ‘libarclite‘ at the path

Xcode16以上版本更新SDK之后就报错了。是因为缺少libarclite_iphoneos.a文件。所以需要在网上找一下该文件根据路径添加进去&#xff0c;arc文件可能需要新建一下。 clang: error: SDK does not contain ‘libarclite’ at the path ‘/Applications/Xcode.app/Contents/Develo…...