MySQL B+ 树索引详解:从原理到实战优化

引言

在现代数据库应用中,查询效率是影响系统性能的关键因素之一。而索引,尤其是 B+ 树索引,是 MySQL 中最常用、最重要的性能优化手段。正确使用索引可以将查询时间从毫秒级降低到微秒级,极大地提升应用响应速度。

1. B+ 树索引的重要性

可以将 B+ 树索引类比为一本书的目录或图书馆的索书号系统:

  • 目录类比:如果我们需要找到某个章节的内容,而没有目录,我们必须一页页翻书才能找到目标;有了目录,我们只需查目录页,就能直接定位到目标页码。

  • 索书号类比:在图书馆,如果书籍没有编号,需要逐本翻找;有了编号系统,可以快速定位书籍所在位置。

同理,在数据库中,如果没有索引:

  • 查询条件的字段没有索引,数据库只能 全表扫描

  • 全表扫描在大表(如百万级或千万级数据)中,性能开销巨大。

2. MySQL 中索引的作用

索引的核心作用是 提高查询效率,具体表现在:

  1. 快速定位数据:利用索引可以减少磁盘 I/O 次数,从而提高查询速度。

  2. 支持排序和分组:某些情况下,索引可以直接提供有序数据,避免额外排序操作。

  3. 辅助约束实现:如 唯一约束主键约束,本质上依赖索引实现。

示例说明

假设有一张用户表 users

CREATE TABLE users (id INT PRIMARY KEY,username VARCHAR(50),email VARCHAR(100),age INT
);

如果我们查询:

SELECT * FROM users WHERE id = 12345;
  • 有索引PRIMARY KEY):数据库通过聚簇索引直接定位到对应数据页,速度极快。

  • 无索引:数据库必须扫描整张表,逐行比较 id,查询时间随数据量线性增长。

提示:在大数据量表中,索引的存在几乎是查询性能优化的第一步。


这一章节的重点是让读者理解:

  • B+ 树索引为什么重要;

  • 没有索引时的查询成本;

  • 索引对数据库性能的直接影响。

没有索引时的查找

当表中没有任何索引时,MySQL 查询会退化为 全表扫描(Full Table Scan)。这意味着数据库必须逐行读取数据,直到找到符合条件的记录。

1. 单页查找 vs 多页查找

MySQL 的存储引擎(尤其是 InnoDB)将表数据按 页(Page) 管理,默认每页大小为 16KB。数据页是数据库存储和 I/O 的基本单位。

单页查找

如果查询的数据正好在一个数据页中:

  • 数据库只需读取该页即可完成查询;

  • I/O 成本较低,查询速度快。

类比:一本书,目标内容在当前阅读页,只需翻一次即可找到。

多页查找

如果查询的数据分布在多页中:

  • 数据库必须读取多个页,进行多次磁盘 I/O;

  • 数据量大时,查询成本显著增加。

类比:目标内容分散在书的多个章节,每次翻页都需要查找页码,耗时更久。

SQL 示例

假设有一张大表 orders,存储千万级订单数据:

CREATE TABLE orders (order_id BIGINT,user_id BIGINT,amount DECIMAL(10,2),order_date DATE
) ENGINE=InnoDB;

查询示例

SELECT * FROM orders WHERE user_id = 987654321;
  • 没有索引:MySQL 必须扫描整个表,每行检查 user_id,I/O 成本与表大小线性增长。

  • 结果:当数据量达到千万级别时,查询可能需要几秒甚至几十秒。

2. 全表扫描的性能瓶颈

全表扫描的主要瓶颈体现在 磁盘 I/OCPU 扫描成本

  1. 磁盘 I/O:磁盘读取是最慢的操作,尤其是机械硬盘(HDD);即使是 SSD,读取大量数据也会消耗时间。

  2. CPU 扫描:每行数据都需要逐个比较查询条件,即使每次比较耗时微秒级,总体也会显著增加。

  3. 缓存失效:大表无法完全放入缓存(Buffer Pool),频繁读取磁盘页,加重 I/O 压力。

真实场景类比
  • 电商场景:假设想查询某个用户的历史订单,没有索引意味着系统必须遍历所有订单记录,每新增一百万条订单,查询时间都会增长。

  • 社交场景:查询某个用户的好友关系时,如果没有索引,需要扫描整张好友表,耗时巨大。

3. 小结

没有索引时,数据库查询效率低,尤其是大表:

  • 单页查找仍可快速返回,但多页查找耗时明显增加;

  • 全表扫描是大数据量表查询的性能瓶颈。

引导思考:这正是 B+ 树索引发挥价值的地方,它可以通过多层树结构快速定位目标页,避免全表扫描,提高查询效率。

B+ 树索引原理

B+ 树是数据库索引设计中最常用的数据结构,尤其适合磁盘存储的大规模数据表。MySQL 的 InnoDB 和 MyISAM 默认都采用 B+ 树索引来加速查询。

1. B+ 树的定义

B+ 树是一种多路平衡搜索树,具有以下特点:

  1. 所有叶子节点形成有序链表

    • 叶子节点存储实际数据(或数据指针);

    • 叶子节点通过指针串成有序链表,方便范围查询。

  2. 非叶子节点只存储索引信息

    • 非叶子节点只保存关键字和子节点指针,不存储完整数据;

    • 可以大幅提高单个节点能容纳的关键字数量,降低树的高度。

  3. 自平衡

    • 插入或删除操作会触发节点分裂或合并,保证树的高度平衡;

    • 平衡树意味着查找任意数据所需路径长度接近,查询性能稳定。

  4. 多路搜索

    • 每个节点可以有 m 个子节点(m 称为阶),相比二叉树(最多 2 个子节点),大幅减少树高度;

    • 树高度降低意味着磁盘 I/O 次数减少,从而提高查询效率。

图示类比
  • 书籍目录类比

    • 根节点相当于书的总目录;

    • 中间节点是章节目录;

    • 叶子节点是具体页码。

  • 查找目标页时,只需从总目录到章节,再到页码,不用逐页翻书。


2. B+ 树的特性

特性描述数据库场景意义
平衡性树的所有叶子节点在同一层查询任意数据路径长度相同,性能稳定
顺序性叶子节点通过指针串成链表支持范围查询、排序查询
多路性每个节点存储多个关键字和指针树高低,减少磁盘 I/O
非叶子节点只存储索引节省空间,增加扇出节点能存更多索引,减少树层数

提示:B+ 树高度通常很低,即使表中有亿级数据,树高可能仅 3~4 层。


3. B+ 树与 B 树、二叉树的区别

特性二叉树B 树B+ 树
每个节点最多子节点数2mm
数据存储位置节点节点叶子节点
顺序访问复杂可通过中序遍历叶子节点链表支持高效顺序访问
高度高(随数据量增加)更低,查询路径更短
范围查询效率低可行高效(叶子节点链表)
核心区别总结
  1. 二叉树:结构简单,单层存储一个关键字;大数据量下高度高,磁盘 I/O 多。

  2. B 树:多路平衡树,数据分布在所有节点;顺序访问需中序遍历。

  3. B+ 树:数据只在叶子节点,叶子链表支持顺序访问;磁盘 I/O 最小,查询效率最高。

MySQL 选择 B+ 树而非 B 树或二叉树,正是为了 降低磁盘 I/O,提高范围查询效率


4. B+ 树在磁盘 I/O 上的优化

数据库中的大数据通常存储在磁盘上,而磁盘 I/O 是最慢的操作。B+ 树通过以下方式优化磁盘访问:

  1. 节点尽量大

    • 一个节点可以存储多个关键字(如 100~200 个),减少访问次数。

    • 单次读取可获取更多索引信息,降低磁盘读次数。

  2. 叶子节点链表

    • 范围查询只需顺序访问叶子节点链表,避免多次回溯根节点。

  3. 扇出大,树高低

    • 树高低意味着查找任意数据只需少量磁盘页访问,性能稳定。

示例类比

假设每页能存储 100 个关键字,数据库有 1000 万条记录:

  • 二叉树:可能需要约 24 层(2^24 > 1000万),每次查找要 24 次磁盘访问。

  • B+ 树:扇出 100,每层能存 100 个关键字,树高仅 34 层,查找只需 34 次磁盘访问,大幅减少 I/O 成本。


5. B+ 树查找过程示例

假设我们有一个 B+ 树索引,存储 user_id 字段:

SELECT * FROM users WHERE user_id = 12345;

查找步骤

  1. 从根节点开始,根据关键字判断到哪一个子节点;

  2. 进入子节点,再判断到哪一个子节点;

  3. 到达叶子节点,找到匹配 user_id 的数据;

  4. 如果是范围查询,顺序访问叶子节点链表即可。

通过多路树和叶子链表,B+ 树能够在 O(log n) 的复杂度下完成查找,并支持高效范围查询。


6. 小结

B+ 树索引的核心优势:

  • 低树高:减少磁盘 I/O,查询效率高。

  • 有序叶子节点链表:支持范围查询和排序。

  • 非叶子节点只存索引:节省存储空间,提高节点扇出。

  • 平衡性:保证任意查询路径长度相同,性能稳定。

引导思考:理解了 B+ 树原理后,我们才能深入解析 MySQL 的 InnoDB 聚簇索引与二级索引实现,以及 B+ 树如何在实际业务中发挥性能优势。

MySQL 中的 B+ 树索引实现

在 MySQL 中,不同存储引擎对 B+ 树索引的实现有所差异,理解这些差异对于索引优化至关重要。


1. InnoDB 存储引擎的 B+ 树索引

InnoDB 是 MySQL 的默认存储引擎,支持事务、行级锁和外键约束。它的索引主要分为 聚簇索引(Clustered Index)二级索引(Secondary Index)

1.1 聚簇索引(Clustered Index)

特点

  1. 表数据和索引存储在同一 B+ 树叶子节点

    • 每个叶子节点存储完整行数据(整行记录);

    • 叶子节点顺序与主键顺序相同。

  2. 主键默认聚簇

    • 每张 InnoDB 表必须有主键;

    • 如果没有显式主键,InnoDB 会选择一个唯一非空索引作为聚簇索引;

    • 若都没有,会内部生成隐藏主键。

  3. 查询效率高

    • 根据主键查找记录,直接定位叶子节点,无需额外访问数据页。

示例

创建一张用户表:

CREATE TABLE users (id BIGINT PRIMARY KEY,username VARCHAR(50),email VARCHAR(100),age INT
) ENGINE=InnoDB;
  • id 为主键,InnoDB 会构建聚簇索引。

  • 查询:

    SELECT * FROM users WHERE id = 1001;
    
  • 直接通过聚簇索引定位叶子节点,返回整行数据。

类比:聚簇索引就像图书馆按索书号排序的书架,书架顺序与索书号完全一致,找到书籍无需额外翻找。


1.2 二级索引(Secondary Index)

特点

  1. 叶子节点存储索引列 + 主键

    • 二级索引不存储整行数据,叶子节点存储索引字段和对应的主键;

    • 查询时先通过二级索引找到主键,再回聚簇索引取数据(称为 回表)。

  2. 支持非主键列查询

    • 用于加速 WHERE 条件或 JOIN 的非主键字段查询。

示例

email 字段建立索引:

CREATE INDEX idx_email ON users(email);

查询:

SELECT * FROM users WHERE email = 'test@example.com';
  • InnoDB 先通过二级索引 idx_email 找到主键 id

  • 再通过聚簇索引回表获取整行数据。

提示:二级索引查询可能比主键查询稍慢,因为涉及一次回表操作。


2. MyISAM 存储引擎的 B+ 树索引

MyISAM 是 MySQL 的早期默认引擎,非事务型,索引实现方式有所不同。

2.1 特点
  1. 叶子节点只存储指针

    • 数据文件和索引文件分开存储;

    • 叶子节点存储数据在数据文件中的地址(偏移量),不是整行数据。

  2. 索引访问需要额外 I/O

    • 查询时先通过 B+ 树找到数据地址,再读取数据文件。

示例
CREATE TABLE myisam_users (id BIGINT PRIMARY KEY,username VARCHAR(50),email VARCHAR(100)
) ENGINE=MyISAM;CREATE INDEX idx_email ON myisam_users(email);
  • 查询 email 时,索引只提供数据地址,数据库需要额外读取数据页获取整行信息。

类比:像查阅图书馆目录,目录给出书架编号,需要再去书架拿书,比 InnoDB 聚簇索引多了一步。


3. 聚簇索引 vs 二级索引对比

特性聚簇索引(InnoDB)二级索引(InnoDB / MyISAM)
数据存储位置叶子节点存储整行数据叶子节点存储索引列 + 主键(InnoDB)或数据地址(MyISAM)
查询效率略低,需要回表
适用场景主键查询、范围查询非主键字段查询、JOIN
物理顺序与主键顺序一致不保证与数据顺序一致

优化提示:对经常查询的非主键列建立二级索引,可以显著提升查询性能,但要考虑回表成本。


4. B+ 树索引在查询中的实际应用

4.1 精确查询
SELECT * FROM users WHERE id = 12345;  -- 使用聚簇索引
SELECT * FROM users WHERE email = 'abc@test.com';  -- 使用二级索引
  • 聚簇索引查询直接定位数据;

  • 二级索引查询需要一次回表。

4.2 范围查询
SELECT * FROM users WHERE id BETWEEN 1000 AND 2000;  -- 聚簇索引
SELECT * FROM users WHERE age BETWEEN 20 AND 30;    -- 二级索引
  • 范围查询通过叶子节点链表顺序遍历叶子节点,高效获取连续数据。

4.3 排序查询
SELECT * FROM users ORDER BY id ASC;  -- 聚簇索引天然有序
  • 聚簇索引顺序存储,可直接使用索引避免额外排序操作。


5. 小结

  • InnoDB:聚簇索引存储整行数据,二级索引存储索引列 + 主键;支持高效查找、范围查询和排序。

  • MyISAM:索引与数据分离,叶子节点存数据地址;查询时需要额外 I/O。

  • B+ 树优势:无论哪种存储引擎,都能保证低树高、顺序访问、快速定位目标数据。

引导思考:理解索引在不同存储引擎中的实现,有助于在下一章设计高效的索引策略,实现实际查询优化。

B+ 树索引的优化策略

良好的索引设计不仅能提升查询性能,还能降低数据库 I/O 压力。下面我们详细讲解常用优化策略。


1. 索引设计原则

1.1 最左前缀原则

定义:在 联合索引(Composite Index)中,索引的有效性遵循最左前缀原则,即查询条件必须从索引最左边的列开始使用。

示例

创建联合索引:

CREATE INDEX idx_user_age ON users(username, age);
  • 查询有效索引:

    SELECT * FROM users WHERE username = 'alice';       -- 使用索引
    SELECT * FROM users WHERE username = 'alice' AND age = 25;  -- 使用索引
    
  • 查询无效索引:

    SELECT * FROM users WHERE age = 25;  -- 无法使用 idx_user_age
    

提示:联合索引中,最左列应选择选择性高、查询频繁的字段。


1.2 覆盖索引(Covering Index)

定义:查询中使用的字段全部包含在索引中,无需回表即可返回结果。

示例
CREATE INDEX idx_email_age ON users(email, age);SELECT email, age FROM users WHERE email = 'test@example.com';
  • 索引包含查询字段,无需访问聚簇索引叶子节点;

  • 查询速度更快,尤其在大表上效果显著。

类比:像查图书馆目录时,目录本身就包含所有信息,无需去书架取书。


1.3 联合索引设计策略
  • 选择性优先:索引最左列应选择 选择性最高(不同值多)的字段。

  • 避免重复冗余:不要重复创建已包含的列组合索引。

  • 考虑查询频率:根据常用查询条件建立联合索引。


2. 避免索引失效的常见问题

2.1 数据类型隐式转换
SELECT * FROM users WHERE id = '123';  -- id 为 INT,查询传入字符串
  • 会触发类型转换,导致索引失效。

  • 解决方案:保持数据类型一致。

2.2 函数或表达式操作
SELECT * FROM users WHERE DATE(order_date) = '2025-08-01';
  • 对索引列使用函数,MySQL 无法利用索引;

  • 优化方式:

    SELECT * FROM users WHERE order_date BETWEEN '2025-08-01 00:00:00' AND '2025-08-01 23:59:59';
    

2.3 前缀模糊匹配
SELECT * FROM users WHERE username LIKE '%abc';  -- 索引失效
SELECT * FROM users WHERE username LIKE 'abc%';  -- 索引有效
  • 索引只对前缀匹配有效,避免使用前置通配符。

2.4 OR 条件查询
SELECT * FROM users WHERE username = 'alice' OR email = 'test@example.com';
  • MySQL 可能无法同时使用索引,可考虑使用 UNION 优化:

SELECT * FROM users WHERE username = 'alice'
UNION
SELECT * FROM users WHERE email = 'test@example.com';

3. 索引优化实践案例

3.1 精确匹配优化
-- 原查询(无索引)
SELECT * FROM orders WHERE user_id = 987654321;-- 优化后
CREATE INDEX idx_user_id ON orders(user_id);
SELECT * FROM orders WHERE user_id = 987654321;
  • 效果:查询从全表扫描数秒降至毫秒级。

3.2 范围查询优化
-- 原查询
SELECT * FROM orders WHERE order_date BETWEEN '2025-01-01' AND '2025-01-31';-- 优化后
CREATE INDEX idx_order_date ON orders(order_date);
SELECT * FROM orders WHERE order_date BETWEEN '2025-01-01' AND '2025-01-31';
  • 利用 B+ 树叶子节点链表,顺序遍历叶子节点,范围查询高效。

3.3 覆盖索引示例
-- 查询 email 和 age
CREATE INDEX idx_email_age ON users(email, age);SELECT email, age FROM users WHERE email = 'abc@test.com';
  • 查询只访问索引,不回表,显著减少 I/O。


4. 使用 EXPLAIN 分析索引

通过 EXPLAIN 查看查询计划,判断索引是否被使用。

EXPLAIN SELECT * FROM users WHERE email = 'abc@test.com';
  • key 列显示使用的索引;

  • rows 列显示扫描行数;

  • 优化目标:rows 尽量小,索引使用合理。


5. 小结

  • 索引设计原则:最左前缀、覆盖索引、联合索引选择性优先。

  • 避免索引失效:注意数据类型、函数操作、前缀匹配及 OR 条件。

  • 实战技巧:结合 EXPLAIN 分析,观察查询是否真正命中索引。

  • 优化效果:合理索引可将大表查询性能提升数十倍甚至上百倍。

引导思考:理解索引优化策略后,下一步就是索引的创建、管理和维护,这直接关系到实际应用的稳定性和性能。

索引的创建与管理

在 MySQL 中,索引不仅需要设计合理,还需要正确创建、维护和管理,以确保查询性能稳定。


1. 创建索引的 SQL 语句

MySQL 支持多种索引类型:

  • 主键索引(PRIMARY KEY):唯一且不允许 NULL。

  • 唯一索引(UNIQUE):保证索引列唯一。

  • 普通索引(INDEX / KEY):无唯一性约束。

  • 全文索引(FULLTEXT):用于文本搜索(MyISAM 和 InnoDB 支持不同)。

1.1 创建普通索引
CREATE INDEX idx_username ON users(username);
  • 查询示例:

SELECT * FROM users WHERE username = 'alice';
1.2 创建联合索引
CREATE INDEX idx_user_email ON users(username, email);
  • 查询示例:

SELECT * FROM users WHERE username = 'alice' AND email = 'abc@test.com';
  • 注意:遵循 最左前缀原则

1.3 创建唯一索引
CREATE UNIQUE INDEX idx_email_unique ON users(email);
  • 确保 email 列的唯一性,适合用户注册或账号字段。

1.4 创建主键索引
ALTER TABLE users ADD PRIMARY KEY(id);
  • InnoDB 默认使用主键构建聚簇索引。


2. 删除索引的 SQL 语句

  • 删除普通索引:

DROP INDEX idx_username ON users;
  • 删除唯一索引同理。

  • 删除主键索引:

ALTER TABLE users DROP PRIMARY KEY;

注意:删除索引会影响查询性能,操作前需评估影响范围。


3. 索引的维护与重建

索引在长期使用中可能需要维护,常见操作包括重建和优化:

3.1 重建索引
  • 重建索引可清理碎片,提高查询性能。

  • 对 MyISAM 表:

OPTIMIZE TABLE users;
  • 对 InnoDB 表:

ALTER TABLE users ENGINE=InnoDB;

以上操作会重建表和索引,适合大表碎片整理或索引结构优化。

3.2 删除低效索引
  • 使用 EXPLAIN 分析查询计划,找出未使用或低效索引;

  • 删除或合并索引,避免重复占用空间。

3.3 定期检查索引
  • 查询 information_schema.STATISTICS 表,了解索引信息:

SELECT INDEX_NAME, COLUMN_NAME, NON_UNIQUE FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = 'your_db' AND TABLE_NAME = 'users';
  • 根据业务查询特点,调整索引结构。


4. 实战案例

4.1 优化查询
-- 原查询无索引 SELECT * FROM orders WHERE user_id = 987654321; 
-- 创建索引 CREATE INDEX idx_user_id ON orders(user_id); 
-- 查询性能显著提升 EXPLAIN SELECT * FROM orders WHERE user_id = 987654321;
4.2 重建索引清理碎片
-- 长期运行表,索引碎片多
OPTIMIZE TABLE orders;-- 再次执行查询,I/O 更少,性能稳定
SELECT * FROM orders WHERE user_id = 987654321;

5. 小结

  • 创建索引:根据查询场景选择主键、唯一索引、普通索引或联合索引。

  • 删除索引:慎重操作,避免影响查询性能。

  • 索引维护:重建、优化和定期检查索引,可保证长期性能稳定。

  • 实践技巧:结合 EXPLAIN 分析索引使用情况,持续优化。

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

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

相关文章

计算机内存中的整型存储奥秘、大小端字节序及其判断方法

目录 一、回顾与引入:整数在内存中的存储方式 为什么要采用补码存储? 二、大小端字节序及其判断方法 1、什么是大小端? 2、为什么存在大小端? 3、练习 练习1:简述大小端概念并设计判断程序(百度面试…

Redis 最常用的 5 种数据类型

Redis 支持多种灵活的数据类型,每种类型针对特定场景优化。以下是 **Redis 最常用的 5 种数据类型**及其核心特点和应用场景:1. 字符串(String)描述:最基本的数据类型,可存储文本、数字(整数/浮…

【嵌入式】RK3588 对比 NVIDIA Jetson,Radxa Rock 5B vs Orange Pi 5 Max

RK3588这个芯片,适合AI应用么,为什么这么贵呢 AI 边缘盒子里的旗舰芯 深度分析一下 RK3588(瑞芯微 Rockchip RK3588) 为什么被很多人关注在 AI 应用,以及它价格偏高的原因。 🧩 1. RK3588 的基本情况 制程:8nm(Samsung 8nm LP) CPU:8 核 big.LITTLE 架构(4 Cortex-…

暴雨让高性能计算更“冷静”

当AI大模型的参数突破万亿,当深地探测的精度迈向微米,当数字经济的脉搏与千行百业深度共振,算力已成为驱动时代向前的核心引擎。然而,传统风冷技术在高密度算力需求面前渐显乏力——机柜内的热浪如同无形的枷锁,既制约…

SpringAI集成MCP

文章目录1_调用公用MCP2_Stdio方式3_Stdio实现原理4_SSE方式5_自定义MCP客户端6_MCP Server权限控制SpringAI 通过 SpringBoot 集成扩展了 MCP Java SDK ,提供了客户端和服务端 starter,让 AI 应用程序快速支持 MCP。接下来直接演示。 1_调用公用MCP 在…

Spring Start Here 读书笔记:第10章 Implementing REST services

REST 服务可用于实现两个应用之间的通讯,包括 Web 应用中的客户端和服务器之间,移动应用与后端服务之间,或两个后端服务之间。 10.1 使用 REST 服务在应用之间交换数据 REST端点是应用程序通过 Web 协议公开服务的方式,因此也称…

SYBASE ASE、Oracle、MySQL/MariaDB、SQL Server及PostgreSQL在邮件/短信发送功能上的全面横向对比报告

以下是对SYBASE ASE、Oracle、MySQL/MariaDB、SQL Server及PostgreSQL在邮件/短信发送功能上的全面横向对比报告(截至2025年8月最新版本),涵盖技术实现、配置复杂度、适用场景及权威评测:​​一、邮件发送能力对比​​​​1. Orac…

服务器与客户端

目录 一、服务器(Server) 核心特点 常见类型 二、客户端(Client) 核心特点 常见类型 客户端与服务器的交互流程 补充:与 “对等网络(P2P)” 的区别 C/S模式 一、C/S 模式的核心原理 …

GaussDB 并发自治事务数达到最大值处理案例

1 业务背景自治事务(Autonomous Transactions)是一种高级特性,允许你在一个事务中执行另一个独立的事务。这种机制特别有用,尤其是在需要在一个事务中执行多个操作但又不想因为其中一个操作失败而影响整个事务的场景。2 业务影响在…

【传奇开心果系列】Flet分页自定义组件CustomPaginationComponent封装版自定义模板

Flet分页自定义组件CustomPaginationComponent封装版自定义模板一、效果展示GIF动图二、应用场景三、特色说明四、源码下载地址一、效果展示GIF动图 二、应用场景 图片浏览应用: 用户可以通过分页组件浏览多张图片,每点击一次“上一页”或“下一页”按钮…

数据安全——39页解读数字化转型大数据安全基础培训方案【附全文阅读】

适应人群为企业数据安全管理人员、IT 运维人员、数字化转型决策者、网络安全工程师及关注大数据安全的从业人员。主要内容围绕数字化转型中大数据安全展开,核心包括基础概念(信息、数据与大数据的定义及区别,大数据 4V 特点与来源);安全风险(企业面临的数据资产管理缺失、…

week3-[二维数组]小方块

week3-[二维数组]小方块 题目描述 如果四个数 a,b,c,da,b,c,da,b,c,d 可以分成两组,每组两个数,满足每组里面的两个数一样,那么称这四个数是好的。 比如,2,5,2,52,5,2,52,5,2,5 是好的,因它满足两组:222 与…

Swift 项目结构详解:构建可维护的大型应用

Swift 项目结构详解:构建可维护的大型应用一、基础结构(推荐新手使用)二、组件化结构(企业级应用推荐)层级架构:MVVM Coordinator路由实现(Coordinator模式)三、通用组件实现DI&…

【实时Linux实战系列】基于实时Linux的数字转换器设计

在现代电子系统中,数字转换器(如模数转换器ADC和数模转换器DAC)扮演着至关重要的角色。它们负责将模拟信号转换为数字信号,或将数字信号转换为模拟信号,从而实现信号的数字化处理和传输。在实时系统中,如工…

FastTracker:实时准确的视觉跟踪

摘要 https://arxiv.org/pdf/2508.14370 传统的多目标跟踪(MOT)系统主要设计用于行人跟踪,通常对其他物体类别的泛化能力有限。本文提出了一种能够处理多种物体类型的通用跟踪框架,特别强调在复杂交通场景中的车辆跟踪。所提出的1方法包含两个关键组件&a…

国产轻量级桌面GIS软件Snaplayers从入门到精通(20)

国产轻量级桌面GIS软件Snaplayers实操:打开图层并显示属性信息1、根据数据格式选择图层文件2、加载图层到地图中,并在左侧显示图层的属性表格3、属性表格分页显示Snaplayers研发团队承诺:国产轻量级桌面GIS软件Snaplayers永久免费并持续更新

快速入门flask应用(从入门到实战)

目录 前言: 了解一些网络通信的概念 什么是网络通信: 当我们访问一个网址的时候发生了什么: 1. 解析 URL:明确访问目标 2. DNS 域名解析:将 “名字” 转为 “地址” 3. 建立连接:TCP 三次握手&#x…

C++/QT 开发技能树详解

一、 编程语言 (C)1. C基础语法(数据类型、模板、命名空间)是什么: 这是构建C程序的基石。数据类型定义了变量存储的数据种类和大小;模板允许编写与数据类型无关的通用代码;命名空间用于避免大型项目中的名称冲突。如何…

Java多线程进阶-死锁与面试题解析

文章目录Java多线程进阶:死锁与面试题解析一、并发编程的噩梦——死锁1. 什么是死锁?四个缺一不可的条件2. 如何避免死锁?从破坏循环等待开始二、并发编程面试题全景解析1. 锁与同步机制2. CAS 与原子操作3. JUC 工具与线程池4. 线程安全集合…

ZYNQ启动流程——ZYNQ学习笔记11

ZYNQ SoC 的启动由片上的 BootROM 开始。片上 BootROM 是 ZYNQ 芯片上的一块非易失性存储器,它包含了 ZYNQ 所支持的配置器件的驱动, 而且里面的代码是不可修改的。 BootROM 中的代码首先会在片外的非易失性存储器中寻找一个头文件, 头文件里…