TiDB预研-分页查询、连接查询、执行计划
目录
- 分页查询原理
- 连接查询原理
- 查询计划分析
https://docs.pingcap.com/zh/tidb/stable/dev-guide-join-tables/
https://cn.pingcap.com/blog/tidb-query-optimization-and-tuning-1/
https://github.com/pingcap/blog-cn/blob/master/how-to-use-tidb.md
分页查询
深分页问题
传统MySQL关系数据库依靠按照某个key排序,然后limit…offset实现分页查询,数据量大的时候,深分页的时候,效率就会很慢。
因为MySQL的limit…offset是取全部数据,然后再丢弃offset之前的数据,因为,limit语句会先扫描offset+n行,然后再丢弃掉前offset行,返回后n行数据。也就是说limit 100000,10,就会扫描100010行,而limit 0,10,只扫描10行。
针对这种问题,优化方案
- 游标分页
- 覆盖索引
- 业务层优化
1、游标分页(Cursor-based Pagination)
原理:基于唯一递增字段(如主键)作为游标,避免扫描跳过数据。
优化offset过大效率低的问题:当偏移量offset过大的时候,使用limit的效率就不是那么高了,可以进行优化。(1)如果id键无序,可以使用父查询将in替换成连接查询inner join(2)如果id键有序,可以使用id>= 、limit。参考之前:Nebula Graph学习篇3_多线程完成6000w+关系数据迁移_nebula limit-CSDN博客
-- 第一页
SELECT * FROM table WHERE id > 0 ORDER BY id LIMIT 10;
-- 后续页(假设上一页最后一条id=10)
SELECT * FROM table WHERE id > 10 ORDER BY id LIMIT 10;
对于多条件查询,可以采用标签记录法每次把当前页的最后一条记录的id返回给前端,前端下次查询的时候在带过来,参考:千万级数据深分页查询SQL性能优化实践 | 京东云技术团队
select id,biz_content,pin FROM follow_fans_1
where biz_content = #{bizContent} and id < #{lastId}
order by id desc
limit 10;# 最后一页数据不足10条的时候,可能导致全表扫描超时
# 因此最后一个需要一个条件 > minId,这个查询可以异步去查询防缓存,因为也有可能超时,或者大数据离线去计算。
优点:时间复杂度稳定为 O(N),适合海量数据分页
2、覆盖索引优化
原理:通过覆盖索引直接获取分页所需的主键,减少回表操作。
SELECT t.* FROM table t
JOIN (SELECT id FROM table ORDER BY id LIMIT 100000, 10) tmp
ON t.id = tmp.id;
3、业务层优化
限制最大分页深度:如仅允许访问前 1000 页,避免极端深分页场景。
预加载与缓存:对静态数据提前分页缓存,减少实时查询压力
分库分表非分片键分页查询
传统分库分表的索引都是在每个mysql实例里,跟着表走的。分库分表规则,一般都是根据表中的userid用户字段或组合性较高的字段来做切分库或者表的键,相同的userid将会落在相同的库或者表。
但是上述情况下,表中的索引字段假设为code,则code="aaa"的可能会因为不同的userid落在不同的库中,需要查询全量的库和表后,再重新聚合,这样就会增加CPU、内存查询的消耗、还有TCP连接握手的消耗。
针对这种问题,优化方案
- 使用二级索引表
- 构建反向索引
- 索引冗余字段
1、使用二级索引表
如针对code、userid、table_index、db_index在创建一个表,查询的时候先到这个表找出具体的userid,然后到具体的分库、分表取数据,可以一定程度避免全表扫描。
优点:可以快速定位具体数据位置,减少全表扫描,实现简单
缺点:需要维护额外的索引表,存在双写一致性问题,索引表可能成为性能瓶颈
2、构建反向索引
另外一种方案是使用ES等中间件构建反向索引,存储某个关键字出现的分库、分表
{"code": "aaa","locations": [{"db": "db0", "table": "table1"},{"db": "db1", "table": "table2"}]
}
优点:查询性能好,支持复杂查询,可扩展性强
缺点:系统复杂度增加,需要额外维护ES集群,存在数据同步延迟
3、分片时考虑多个字段
如将code 和 userid 组合作为分片键,
-- 分片规则:hash(user_id + code) % n
优点:实现简单,无需额外组件,性能好
缺点:不够灵活,可能导致数据分布不均,不适合所有场景
TiDB的分页查询
TiDB 的分页查询在分布式环境下有以下特点:
- 数据分片处理:数据分布在多个 TiKV 节点上,查询时需要从多个节点收集数据,在 TiDB 层汇总排序后再应用 LIMIT 和 OFFSET
- 执行计划优化:当有索引时,TiDB 优先使用索引扫描,对于 WHERE id > X LIMIT Y 模式,可以利用索引直接定位,对于简单的 LIMIT OFFSET,需要扫描所有符合条件的行
- 内部实现机制优化:使用 Coprocessor 框架将部分计算下推到 TiKV,在TiDB节点不用对所有的表数据处理,TiDB 节点负责最终的排序和限制操作,对于大偏移量的分页,TiDB 仍需处理大量中间结果
Coprocessor部分计算下推举个例子
-- 按工资排序
-- 其中dept_id = 101数据在多个Region以及TiKV节点
SELECT * FROM employees
WHERE dept_id = 101
ORDER BY salary DESC
LIMIT 10;1、 dept_id没有索引的情况
- 同一个 dept_id 的数据可能分散在多个 TiKV 节点
- 数据按主键范围进行分片存储
- 需要扫描所有 Region 查找 dept_id = 101 的数据2、dept_id没有索引的情况
- 建立 dept_id 索引后,相同 dept_id 的索引数据会相对集中
- 通过索引可以快速定位数据位置
- 减少需要扫描的 Region 数量-- 下推到TiKV
1. TiKV 节点执行:- 过滤 dept_id = 101- 本地排序- 返回局部有序结果2. TiDB 节点执行:- 合并多个有序结果集- 应用 LIMIT
注意
1、避免大偏移量:
使用 WHERE id > last_id 代替 OFFSET
大偏移量会导致大量数据扫描和丢弃2、索引优化:
确保 ORDER BY 子句中的列有索引
理想情况是使用聚簇索引或覆盖索引3、合理的页大小:
避免过大的 LIMIT 值,这会增加网络传输和内存压力
使用估算总数:
对于大表,使用 EXPLAIN ANALYZE 或近似计数而非 COUNT(*)
使用自增唯一键作为游标取代 limit offset 分页需要注意的是,由于 TiDB 里面自增列只保证自增且唯一,所以有可能自增列会存在空洞(例如:limit 10 offset 2 有可能 ID 返回的 3,4,5,6,7,30001,30002,30003,30004,30005),还有一点就是自增 ID 的顺序与 数据 Insert 的顺序 没有必然的关系。另外,更加建议使用的是自增唯一键,而非自增主键。自增主键有可能会引发写热点问题。
连接查询原理
查询过程
TiDB Server 主要是拆分子任务,将计算下推到存储TiKV层,join都是在TiDB Server进行的,有些过滤条件或聚合函数是可以下推到tikv,减少传输到TiDB Server的数据量
- SQL 解析与优化:TiDB Server 接收 SQL 请求后,会通过 SQL 解析器生成抽象语法树(AST),优化器基于统计信息和代价模型生成分布式执行计划。对于连接查询(如 JOIN),优化器会评估不同执行策略(如 Hash Join、Index Join)的代价,选择最优路径。对于复杂 JOIN,TiDB 可能将部分计算(如 Hash Join 的构建阶段)下推到 TiKV,提升执行效率。
- 分布式执行计划:TiDB 的优化器会将连接操作拆分为多个子任务,根据数据分布将计算下推到存储层(TiKV),避免全量数据传输。
- 若 JOIN 键与数据分片(Region)分布一致,可直接在 TiKV 节点本地执行部分计算
- 若数据分散在多个 TiKV 节点,TiDB 会协调节点间数据交换(如 Shuffle Merge Join),最终合并结果返回客户端
- 执行引擎与 Coprocessor:TiKV 的 Coprocessor 模块负责处理下推的计算任务(如过滤、聚合),减少网络传输。
Join相关算法
TiDB 支持下列三种常规的表连接算法,优化器会根据所连接表的数据量等因素来选择合适的 Join 算法去执行。你可以通过 EXPLAIN 语句来查看查询使用了何种算法进行 Join。
- Index Join:适合预计需要连接的行数较少(一般小于1万行),类似MySQL中的Join算法,先读取一个表t1的数据,然后根据t1中匹配到的每行数据,依次探查t2中的数据,对内存的消耗比较小,如果需要大量的探查,速度可能小于其他Join算法
- Hash Join:简单理解就是将一个表创建map,扫描另外一个表数据判断map中是否存在key,适合需要连接的行数较多,运行速度比Index Join要快,但是需要消耗更多的内存,超过设置的内存阈值可以使用磁盘,在 Hash Join 操作中,TiDB 首先读取 Build 端的数据并将其缓存在 Hash Table 中,然后再读取 Probe 端的数据,使用 Probe 端的数据根据连接key的条件来探查 Hash Table 以获得所需行,TiDB 中的 Hash Join 算子是多线程的,并且可以并发执行。
- Merge Join:这个算法通常会占用更少的内存,但执行时间会更久。当数据量太大,或系统内存不足时,建议尝试使用,Merge Join 是一种特殊的 Join 算法。当两个关联表要 Join 的字段需要按排好的顺序读取时,适用 Merge Join 算法。由于 Build 端和 Probe 端的数据都会读取,这种算法的 Join 操作是流式的,类似“拉链式合并”的高效版。Merge Join 占用的内存要远低于 Hash Join,但 Merge Join 不能并发执行。
举个Merge Join的场景例子
### Merge Join 示例假设我们有两张表:
- `Orders` (订单表,按 customer_id 排序)
- `Customers` (客户表,按 customer_id 排序)#### Orders 表
| order_id | customer_id | amount |
|----------|-------------|---------|
| 1 | 101 | 200 |
| 2 | 101 | 300 |
| 3 | 102 | 150 |
| 4 | 104 | 400 |#### Customers 表
| customer_id | name |
|-------------|----------|
| 101 | Alice |
| 102 | Bob |
| 104 | Charlie |
| 105 | David |### Merge Join 执行过程1. 两个表已经按 customer_id 排序
2. 同时读取两个表的第一行
3. 比较 customer_id:- 如果相等,生成连接结果- 如果不等,移动较小值的游标#### 执行结果
| order_id | customer_id | amount | name |
|----------|-------------|---------|---------|
| 1 | 101 | 200 | Alice |
| 2 | 101 | 300 | Alice |
| 3 | 102 | 150 | Bob |
| 4 | 104 | 400 | Charlie |### 优点
- 内存占用少
- 不需要构建哈希表
- 适合大数据集### 缺点
- 要求输入数据已排序
- 不能并行执行
如果发现 TiDB 的优化器没有按照最佳的 Join 算法去执行。你也可以通过 Optimizer Hints 强制 TiDB 使用更好的 Join 算法去执行。
EXPLAIN SELECT /*+ INL_JOIN(t1, t2) */ * FROM t1 INNER JOIN t2 ON t1.id = t2.t1_id;
EXPLAIN SELECT /*+ HASH_JOIN(t1, t2) */ * FROM t1 INNER JOIN t2 ON t1.id = t2.t1_id;
Hash Join以及Runtime Filter
TiDB 提供了 Runtime Filter 功能,针对 Hash Join 进行性能优化,大幅提升 Hash Join 的执行速度。具体优化使用方式见 Runtime Filter。
Runtime Filter在某些条件可以加快Hash Join的效率,可以在查询规划阶段构建完HashTable之后,将filter相关条件应用于另外一张表扫数据过程中提前过滤用不到的数据,减少扫描时间和网络IO开销。
Hash Join 通过将右表的数据构建为 Hash Table,并将左表的数据不断匹配 Hash Table 来完成 Join。
如果在匹配过程中,发现一部分 Join Key 值无法命中 Hash Table,则说明这部分数据不存在于右表,也不会出现在最终的 Join 结果中。因此,如果能够在扫描时提前过滤掉这部分 Join Key 的数据,将减少扫描时间和网络开销,从而大幅提升 Join 效率。
Runtime Filter 是在查询规划阶段生成的一种动态取值谓词。该谓词与 TiDB Selection 中的其他谓词具有相同作用,都应用于 Table Scan 操作上,用于筛选不满足谓词条件的行为。唯一的区别在于,Runtime Filter 中的参数取值来自于 Hash Join 构建过程中产生的结果
Join Reorder 算法
在多表多个join之间,而 Join 的执行效率和各个表参与 Join 的顺序有关系。
因此优化器需要实现一种决定 Join 顺序的算法。目前 TiDB 中存在两种 Join Reorder 算法,贪心算法和动态规划算法。
- Join Reorder 贪心算法:在所有参与 Join 的节点中,选择行数最小的表与其他各表分别做一次 Join 的结果估算,然后选择其中结果最小的一对进行 Join,再继续这个过程进入下一轮的选择和 Join,直到所有的节点都完成 Join。
- Join Reorder 动态规划算法:在所有参与 Join 的节点中,枚举所有可能的 Join 顺序,然后选择最优的 Join 顺序。
当优化器选择的 Join 顺序并不够好时,你可以使用 STRAIGHT_JOIN 语法让 TiDB 强制按照 FROM 子句中所使用的表的顺序做联合查询。
EXPLAIN SELECT *
FROM authors a STRAIGHT_JOIN book_authors ba STRAIGHT_JOIN books b
WHERE b.id = ba.book_id AND ba.author_id = a.id;
查询计划分析
TiDB的优化器主要有逻辑优化、物理优化,参考:
TiDB 查询优化及调优系列(一)TiDB 优化器简介 | PingCAP 平凯星辰
TiDB 的查询计划是由一系列的执行算子构成,这些算子是为返回查询结果而执行的特定步骤,例如表扫描算子,聚合算子,Join 算子等
目前 TiDB 的计算任务分为两种不同的 task计算:cop task 和 root task。
- cop task 是指TiDB下推到 TiKV 、TiFlash中的 Coprocessor 执行的计算任务
- root task 是指在 TiDB 中执行的计算任务。
参考:
TiDB 查询优化及调优系列(二)TiDB 查询计划简介 | PingCAP 平凯星辰
慢查询日志,参考
TiDB 查询优化及调优系列(三)慢查询诊断监控及排查 | TiDB Books
相关文章:
TiDB预研-分页查询、连接查询、执行计划
目录 分页查询原理连接查询原理查询计划分析 https://docs.pingcap.com/zh/tidb/stable/dev-guide-join-tables/ https://cn.pingcap.com/blog/tidb-query-optimization-and-tuning-1/ https://github.com/pingcap/blog-cn/blob/master/how-to-use-tidb.md 分页查询 深分…...
五、【LLaMA-Factory实战】模型部署与监控:从实验室到生产的全链路实践
【LLaMA-Factory实战】模型部署与监控:从实验室到生产的全链路实践 一、引言 在大模型应用落地过程中,从实验室研究到生产环境部署存在巨大挑战。本文基于LLaMA-Factory框架,详细介绍大模型部署与监控的完整流程,包含推理优化、…...
Unity 点击按钮,打开 Windows 文件选择框,并加载图片
代码如下: using System; using System.Collections; using System.Runtime.InteropServices; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking; using UnityEngine.UI;/// <summary> /// 文件日志类 /// </summary> // […...
深入解析磁盘 I/O 与零拷贝技术:从传统读取到高效传输
深入解析磁盘 I/O 与零拷贝技术:从传统读取到高效传输 在现代计算机系统中,磁盘 I/O 操作是数据处理的核心环节之一。无论是读取文件、写入数据,还是进行网络传输,磁盘 I/O 的效率直接影响到系统的整体性能。本文将深入探讨磁盘 I…...
第十六章,网络型攻击防范技术
网络攻击介绍 网络攻击 --- 指的是入侵或破坏网络上的服务器 ( 主机 ) ,盗取服务器的敏感数据或占用网络带宽。 网络攻击分类: 流量型攻击 网络层攻击 应用层攻击 单包攻击 畸形报文攻击 --- 向目标主机发送有缺陷的IP报文,使得目标在…...
线程的生命周期·
知识点详细说明 Java线程的生命周期由Thread.State枚举明确定义,包含以下6种状态: 1. 新建状态(NEW) 定义:线程对象被创建后,但未调用start()方法。特点: 未分配系统资源(如CPU时间片)。可通过Thread.getState()获取状态为NEW。示例:Thread t = new Thread(); // 状…...
kafka 面试总结
Kafka的幂等性是一种机制,确保生产者发送的每条消息在Broker端只被持久化一次,即使生产者因网络问题等原因重试发送,也不会导致消息重复。 实现原理 生产者ID(PID) 每个生产者实例在初始化时,会被分配一个…...
Webpack基本用法学习总结
Webpack 基本使用核心概念处理样式资源步骤: 处理图片资源修改图片输出文件目录 自动清空上次打包的内容EslintBabel处理HTML资源搭建开发服务器生产模式提取css文件为单独文件问题: Css压缩HTML压缩 小结1高级SourceMap开发模式生产模式 HMROneOfInclud…...
5月9日复盘-混合注意力机制
5月9日复盘 四、混合注意力 混合注意力机制(Hybrid Attention Mechanism)是一种结合空间和通道注意力的策略,旨在提高神经网络的特征提取能力。 1. CBAM Convolution Block Attention Module ,卷积块注意力模块 论文地址&…...
YOLOv8 优化:基于 Damo-YOLO 与 DyHead 检测头融合的创新研究
文章目录 YOLOv8 的背景与发展Damo-YOLO 的优势与特点DyHead 检测头的创新之处融合 Damo-YOLO 与 DyHead 检测头的思路融合后的模型架构融合模型的代码实现导入必要的库定义 Damo-YOLO 的主干网络定义特征金字塔网络(FPN)定义 DyHead 检测头定义融合后的…...
【网安播报】Meta 推出 LlamaFirewall开源框架以阻止 AI 越狱、注入和不安全代码
1、Meta 推出 LlamaFirewall 框架以阻止 AI 越狱、注入和不安全代码 Meta 宣布推出 LlamaFirewall,这是一个开源框架,旨在保护人工智能 (AI) 系统免受新出现的网络风险,例如提示词注入、越狱和不安全代码等。除了 Llam…...
QT 解决msvc fatal error C1060: 编译器的堆空间不足
一.物理内存太小,代码又比较复杂,递归嵌套之类的。 1.修改虚拟内存的大小,一般设置为物理内存的1.5倍。 二.msvc工程的编译默认开启的是多线程编译,所以电脑内存确实不够,采用如下设置。 QMAKE_CXXFLAGS -j1 三.ms…...
PX4开始之旅(一)自动调参
核心知识点:无人机震动与滤波参数 1. 通俗易懂的解释 想象一下,你的无人机就像一个非常敏感的“听众”,它的“耳朵”就是陀螺仪和加速度计这些传感器,用来感知自己是如何移动和旋转的。理想情况下,它应该只“听”到你…...
C++ 中 lower_bound 与 upper_bound 函数详解
C 中 lower_bound 与 upper_bound 函数详解 文章目录 C 中 lower_bound 与 upper_bound 函数详解**一、核心定义与区别****二、使用条件与时间复杂度****三、实际应用场景****四、注意事项与常见误区****五、代码示例****六、总结** 一、核心定义与区别 lower_bound 作用&#…...
minio数据迁移(两台服务器没法相互通信)
场景描述: A服务器 无法访问 B服务器,B服务器 也无法访问 A(即双方都不能通过公网或内网直连对方) MinIO 官方提供了 mc(MinIO Client)命令行工具,可以直接实现 Bucket 之间的数据迁移: 安装 …...
O2OA(翱途)开发平台系统安全-用户登录IP限制
O2OA(翱途)开发平台[下称O2OA开发平台或者O2OA]支持对指定的用户设置可以连接的客户端计算机的IP地址,以避免用户在不安全的环境下访问系统。本篇主要介绍如何开启O2OA用户登录IP限制。 一、先决条件: 以拥有管理员权限的用户账号登录O2OA(翱途)开发平…...
CSS flex:1
在 CSS 中,flex: 1 是一个用于弹性布局(Flexbox)的简写属性,主要用于控制 flex 项目(子元素)如何分配父容器的剩余空间。以下是其核心作用和用法: 核心作用 等分剩余空间:让 flex …...
OpenHarmony平台驱动开发(十一),PIN
OpenHarmony平台驱动开发(十一) PIN 概述 功能简介 PIN即管脚控制器,用于统一管理各SoC的管脚资源,对外提供管脚复用功能。 基本概念 PIN是一个软件层面的概念,目的是为了统一对各SoC的PIN管脚进行管理࿰…...
.NET高频技术点(持续更新中)
1. .NET 框架概述 .NET 框架的发展历程.NET Core 与 .NET Framework 的区别.NET 5 及后续版本的统一平台 2. C# 语言特性 异步编程(async/await)LINQ(Language Integrated Query)泛型与集合委托与事件属性与索引器 3. ASP.NET…...
Spring Cloud - 2( 12000 字详解 Spring Cloud)
一:服务注册和服务发现 - Eureka 1.1 背景 在上一章节的例子中,我们可以看到远程调用时 URL 被硬编码,这导致在更换机器或新增机器时,相关的 URL 需要进行相应的变更。这就需要让所有相关服务去修改 URL,随之而来的就…...
解决Win11下MySQL服务无法开机自启动问题
问题描述 在win11系统中,明明将MySQL服务设置成了自动启动,但在重启电脑后MySQL服务还是无法自动启动,每次都要重新到计算机管理的服务中找到服务再手动启动。 解决方式 首先确保mysql服务的启动类型为自动。 设置方法:找到此电…...
RGB矩阵照明系统详解及WS2812配置指南
RGB矩阵照明系统详解及WS2812配置指南 一、RGB矩阵照明简介 RGB矩阵照明是一种强大的功能,允许使用外部驱动器驱动的RGB LED矩阵为键盘增添绚丽的灯光效果。该系统与RGBLIGHT功能无缝集成,因此您可以使用与RGBLIGHT相同的键码来控制它,操作…...
全球首款无限时长电影生成模型SkyReels-V2本地部署教程:视频时长无限制!
一、简介 SkyReels-V2 模型集成了多模态大语言模型(MLLM)、多阶段预训练、强化学习以及创新的扩散强迫(Diffusion-forcing)框架,实现了在提示词遵循、视觉质量、运动动态以及视频时长等方面的全面突破。通过扩散强迫框…...
代理ARP与传统ARP在网络通信中的应用及区别研究
一些问题 路由器隔离广播域,每个接口/网段都是独立的广播域ARP请求是二层广播包,广播包没法通过路由器ARP请求没法穿越互联网到达目标主服务器 一些思考 电脑访问互联网服务器的时候,ARP询问的内容,真的是访问服务器么…...
理解 Envoy 的架构
理解 Envoy 的架构对于深入理解 Istio 至关重要,因为 Envoy 是 Istio 数据平面的核心。Envoy 是一个高性能的 C 分布式代理,设计为云原生应用和大规模微服务架构的网络基础。 以下是 Envoy 架构的关键组成部分和核心理念: 核心设计理念&…...
使用Kotlin Flow实现Android应用的响应式编程
在Android应用中使用Kotlin Flow实现响应式编程可以分为以下步骤,结合最佳实践和生命周期管理: 1. 添加依赖 在build.gradle中确保包含协程和生命周期相关依赖: dependencies {implementation("org.jetbrains.kotlinx:kotlinx-corouti…...
【AI提示词】蝴蝶效应专家
提示说明 一位专注于分析和优化蝴蝶效应现象的专业人士,擅长将微小变化转化为系统级影响的研究者。 提示词 # Role: 蝴蝶效应专家## Profile - language: 中文 - description: 一位专注于分析和优化蝴蝶效应现象的专业人士,擅长将微小变化转化为系统级…...
StreamRL:弹性、可扩展、异构的RLHF架构
StreamRL:弹性、可扩展、异构的RLHF架构 大语言模型(LLMs)的强化学习(RL)训练正处于快速发展阶段,但现有架构存在诸多问题。本文介绍的StreamRL框架为解决这些难题而来,它通过独特设计提升了训…...
架构进阶:大型制造业企业数据架构顶层设计总体规划方案【附全文阅读】
本文概述了一个大型企业数据架构设计的总体规划方案,针对当前数据架构与管理中存在的诸多问题,如缺乏统一数据模型、数据分析应用体系不健全、主数据管理体系不完善、数据治理体系缺失等,提出了明确的改进目标与实施路径。 数据架构设计思路聚焦于明确数据分布和流向…...
前端指南——项目代码结构解析(React为例)
文件结构 文件项目 ├── doc │ ├── technology.md ├── node_modules ├── public ├── shell ├── src │ ├── auto-generated │ │ ├── apis │ │ ├── models │ ├── components │ │ ├── 组件A │ │ ├── 组件B …...
Redis-数据一致性问题与解决方案
Redis-数据一致性问题与解决方案 引言 Redis 是一个高性能的内存数据库,广泛应用于缓存、会话存储、实时分析等场景。作为一个 NoSQL 数据库,它的高性能和丰富的数据结构使其成为现代微服务架构中不可或缺的组件。然而,在高并发的环境下&am…...
【数据结构】算法的复杂度
前言:经过了C语言的学习,紧接着就步入到数据结构的学习了。在C语言阶段我们在写大多数的oj题的时候会遇到一些问题,就是算法的效率低使用的时间较多,占用的空间也多,数据结构就是来优化算法的。 文章目录 一ÿ…...
Leetcode刷题 由浅入深之字符串——541. 反转字符串Ⅱ
目录 (一)反转字符串Ⅱ的C实现 写法一(s.begin()遍历字符) (二)复杂度分析 时间复杂度 空间复杂度 (三)总结 【题目链接】541. 反转字符串Ⅱ - 力扣&am…...
制造单元智能化改造与集成技术平台成套实训设备
制造单元智能化改造与集成技术平台成套实训设备 一、概述: 本设备以汽车行业的轮毂为产品对象,实现了仓库取料、制造加工、打磨抛光、检测识别、分拣入位等生产工艺环节,以未来智能制造工厂的定位和需求为参考,通过工业以太网完成…...
Vscode 顶部Menu(菜单)栏消失如何恢复
Vscode 顶部Menu(菜单)栏消失如何恢复 https://blog.csdn.net/m0_62964247/article/details/135759655 Vscode 顶部Menu(菜单)栏消失如何恢复? 首先按一下 Alt按键,看一下是否恢复了菜单栏 如果恢复了想了解更进一步的设置,或是没能恢复菜单…...
苍穹外卖--公共字段自动填充
1.问题分析 业务表中的公共字段: 问题:代码冗余、不便于后期维护 2.实现思路 自定义注解AutoFill,用于标识需要进行公共字段填充的方法 自定义切面类AutoFillAspect,统一拦截加入了AutoFill注解的方法,通过反射为公…...
行业 |四大痛点待破:“拆解”DeepSeek一体机
繁荣DeepSeek一体机市场。 2025年开年,DeepSeek大模型掀起的一体机热潮席卷中国AI市场。这款一体机凭借其“开箱即用”的便利性和极低的门槛,吸引了大量企业关注,尤其是在中小企业和行业创新者中,更是成为了新晋“顶流”。 无论…...
革新锅炉厂智能控制——Ethernet IP转CANopen协议网关的工业互联新方案
锅炉厂智能化转型的必经之路 在工业4.0时代,锅炉厂作为能源供应的核心环节,正面临智能化升级的迫切需求。传统锅炉控制系统往往因协议不兼容、数据孤岛问题导致效率低下、维护成本高昂。如何实现设备间高效协同?如何让老旧设备融入智能网络&…...
基于卷积神经网络和Pyqt5的猫狗识别小程序
任务描述 猫狗分类任务(Dogs vs Cats)是Kaggle平台在2013年举办的一个经典计算机视觉竞赛。官方给出的Kaggle Dogs vs Cats 数据集中包括由12500张猫咪图片和12500张狗狗图片组成的训练集,12500张未标记照片组成的测试集。选手需要在规定时间…...
Baklib知识中台引领服务智能跃迁
智能架构重构服务范式 Baklib 知识中台通过全量数据融合与多模态处理能力,重塑企业服务底层逻辑。基于分布式架构设计,平台将分散在业务系统、文档库及外部渠道的非结构化数据进行智能清洗与语义解析,形成标准化的知识元数据池。通过四库体系…...
【Python】超全常用 conda 命令整理
Conda命令整理文档,结合官方指南与高频使用场景分类说明,每个命令都有对应的解释 一、环境管理 1. 创建环境 基本创建conda create --name my_env # 创建名为my_env的空环境 conda create -n my_env python3.11 # 指定Python版本 conda creat…...
FreeRTOS菜鸟入门(十四)·事件
目录 1. 基本概念 2. 应用场景 3. 运作机制 4. 控制块 5. 事件函数接口 5.1 事件创建函数 xEventGroupCreate() 5.2 事件删除函数 vEventGroupDelete() 5.3 事件组置位函数 xEventGroupSetBits()(非中断) 5.4 事件组置位函数 xEventGr…...
setData执行后操作方法-微信小程序
在微信小程序中,setData 是异步执行的,如果你需要在 setData 执行完毕后执行某些操作,可以通过以下几种方式实现: 1. 使用 setData 的回调函数 从基础库 2.2.3 开始,setData 支持传入回调函数,回调会在数据…...
SpringAI特性
一、SpringAI 顾问(Advisors) Spring AI 使用 Advisors机制来增强 AI 的能力,可以理解为一系列可插拔的拦截器,在调用 AI 前和调用 AI 后可以执行一些额外的操作,比如: 前置增强:调用 AI 前改…...
捌拾叁- 量子傅里叶变换
1. 前言 最近公司地震,现在稍微有点时间继续学习。 看了几个算法,都说是基于 量子傅里叶变换 ,好,就是他了 Quantum Fourier。 2. 傅里叶变换 大学是学通信的,对于傅里叶变换还是有所理解的。其实就是基于一个 时域…...
SSTI模版注入
1、概念 SSTI是一种常见的Web安全漏洞,它允许攻击者通过注入恶意模板代码,使服务器在渲染模板时执行非预期的操作。 (1)渲染模版 至于什么是渲染模版:服务器端渲染模板是一种Web开发技术,它允许在服务器端…...
33、前台搜索功能怎么实现?
输入搜索的东西,如果为空 如果有 前端是提交表单,方式是 post 后端接受 调用 mybatisplus的categoryService.getById 用户在搜索框内输入关键字之后,执行 js 中的 load方法,前端提交表单, 后端 controller 中的loa…...
量化解析美英协议的非对称冲击:多因子模型与波动率曲面重构
摘要:基于机器学习算法对市场微观结构的实时监测,黄金价格在3300美元/盎司附近展开技术性反弹。本文通过多因子分析框架,解析美元指数上行、贸易政策突变及资产配置迁移对贵金属市场的复合影响,并构建基于LSTM神经网络的动态支撑位…...
对PyTorch模块进行性能分析
以下是针对PyTorch模块进行性能分析的完整方法与工具指南,结合了多种优化策略和实际应用场景: 一、PyTorch性能分析工具 PyTorch Profiler • 功能:内置的性能分析工具,支持捕获CPU/GPU操作、内存分配、数据形状及硬件利用率。 …...
lvm详细笔记
LVM简介 逻辑卷管理器,是Linux 系统中用于管理磁盘储存的关键技术。 LVM 则打破了磁盘分区一旦确定,其大小调整往往较为复杂,且难以灵活应对业务变化这种限制,它允许用户将多个物理分区组合卷组。例如,系统中的多个物…...