mysql之B+ 树索引 (InnoDB 存储引擎)机制
b+树索引机制
- B+ 树索引 (InnoDB 存储引擎)机制
- **引言:**
- **1. 数据页结构与查找**
- 2. 索引的引入
- **3. InnoDB 的 B+ 树索引**
- **4. InnoDB B+ 树索引的注意事项**
- **5. MyISAM 的索引方案 (选读,与 InnoDB 做对比)**
- **6. MySQL 中创建和删除索引的语句**
- **B+ 树索引的使用**
- **1. 索引的代价**
- **2. B+ 树索引适用的条件**
- **3. 回表的代价**
- **4. 覆盖索引(Covering Index)**
- **5. 如何挑选索引**
- **6. 索引的类型**
- **7. 索引的维护**
- **8. 查询优化器(Query Optimizer)**
- **9. 索引的限制**
- **10. 实际应用案例**
B+ 树索引 (InnoDB 存储引擎)机制
引言:
在海量数据中快速定位所需信息,是数据库性能的关键。InnoDB 存储引擎默认使用 B+ 树索引,这是一种为磁盘或其他直接存取辅助设备设计的高效数据结构。理解 B+ 树索引的原理和机制,是掌握 MySQL 性能调优的基石。
1. 数据页结构与查找
InnoDB 将数据划分为若干个页(Page),每个页默认大小为 16KB。数据页是磁盘和内存交互的基本单位。
-
数据页组成: InnoDB 数据页由 7 个部分组成,包括文件头(File Header)、页头(Page Header)、最大最小记录(Infimum + Supremum)、用户记录(User Records)、空闲空间(Free Space)、页目录(Page Directory)和文件尾(File Trailer)。用户记录按照主键值从小到大顺序排列,形成单向链表。页与页之间通过双向链表连接,形成逻辑上连续的数据存储。
-
查找方式:
-
单页查找:
-
主键****查找: InnoDB 在页目录中为每组记录(默认每组 4-8 条)生成一个槽(Slot),槽中存储该组最大记录的地址偏移量。通过二分法快速定位到包含目标记录的槽,然后在槽内遍历记录(因为槽内记录数较少,遍历开销很小)。
-
非主键查找: 对于没有索引的列,只能从页的第一条记录开始,沿着单向链表逐条遍历,直到找到目标记录或遍历完所有记录。
-
-
多页查找: 在没有索引的情况下,MySQL 需要扫描所有的数据页,对每一页执行单页查找。这在数据量较大时效率极低,即所谓的“全表扫描”。
-
2. 索引的引入
为了避免全表扫描,我们需要一种机制来快速定位到目标记录所在的页。索引应运而生。
-
索引的作用: 索引是一种特殊的数据结构,它以指针的形式“指向”表中的数据,极大地加速了数据检索的速度。 可以把索引比作书籍的目录,通过目录我们可以快速找到感兴趣的章节,而无需翻阅整本书。
-
一个简单的索引方案(作为过渡,帮助理解):
我们可以为每个数据页建立一个目录项,目录项包含两个关键信息:
-
页中最小的主键值(key)。
-
页号(page_no)。
将这些目录项存储在一个数组中,由于数组元素是连续存储的,我们可以利用二分法快速查找。通过比较目标主键值与目录项中的 key 值,就可以迅速确定目标记录所在的页,然后加载该页进行单页查找。
3. InnoDB 的 B+ 树索引
虽然上述简单索引方案能够加速查找,但它存在两个主要问题:
-
当数据量非常大时,目录项的数量也会变得巨大,即使是二分法查找也可能变得低效。
-
当发生数据插入、删除和更新时,维护目录项数组的连续性会带来很大的开销(例如,插入一条记录可能需要移动数组中的大量元素)。
为了解决这些问题,InnoDB 采用了 B+ 树索引。
-
B+ 树结构:
-
叶子节点(Leaf Nodes): 存储所有的数据记录(或指向数据记录的指针,取决于索引类型),并按照键值(索引列的值)排序。叶子节点之间通过双向链表连接,方便范围查询。
-
非叶子节点(Internal Nodes 或 Index Nodes): 存储索引键值和指向下一层节点的指针。非叶子节点不存储实际的数据记录,只起到索引的作用,可以看作是目录的目录。
-
多级目录: B+ 树通过多级目录结构实现快速查找。随着数据量的增加,B+ 树的层级也会相应增加,但通常情况下,B+ 树的高度保持在 2-4 层,这意味着即使在海量数据中,查找一条记录也只需要几次磁盘 I/O。
-
示意图:

-
-
聚簇索引(Clustered Index):
-
InnoDB 存储引擎会自动为表的主键创建聚簇索引。
-
聚簇索引的叶子节点存储的是完整的用户记录(所有列的数据)。
-
数据存储与索引紧密结合,索引即数据,数据即索引。这意味着通过聚簇索引查找记录可以直接获取到所有列的数据,无需额外的回表操作。
-
一张表只能有一个聚簇索引。
-
-
二级索引(Secondary Index 或 Non-Clustered Index):
-
为非主键列创建的索引。
-
二级索引的叶子节点存储的是索引列的值和主键值。
-
通过二级索引查找记录时,通常需要两步:
-
在二级索引树中找到对应的叶子节点,获取主键值。
-
根据主键值回表到聚簇索引中查找完整的记录(这个过程称为回表)。
-
-
一张表可以有多个二级索引。
-
-
联合索引(Composite Index):
-
为多个列同时建立的索引。
-
联合索引的键值按照创建索引时指定的列顺序排序。例如,创建一个 (col1, col2, col3) 的联合索引,数据会先按照 col1 排序,col1 相同的记录再按照 col2 排序,以此类推。
-
联合索引只建立一棵 B+ 树,而不是为每个列单独建立索引。
-
合理设计联合索引可以提高查询效率,减少存储空间。
-
4. InnoDB B+ 树索引的注意事项
-
根页面固定: B+ 树的根节点(Root Node)的页号是固定的,并存储在数据字典中。MySQL 启动时会将根节点加载到内存中,方便快速访问索引。
-
内节点目录项的唯一性:
-
对于聚簇索引,内节点中的目录项包含主键值和页号。
-
对于二级索引,内节点中的目录项包含索引列的值、主键值和页号。通过包含主键值,确保了二级索引内节点目录项的唯一性。
-
-
最少记录数: InnoDB 规定每个数据页(包括叶子节点和非叶子节点)至少存储两条记录(除了根节点)。这是为了避免在数据量较少时出现过多的索引层级,影响查询效率。
5. MyISAM 的索引方案 (选读,与 InnoDB 做对比)
MyISAM 是 MySQL 早期版本中常用的存储引擎,它的索引方案与 InnoDB 有显著不同。
-
数据文件(.MYD): MyISAM 将表的数据存储在
.MYD文件中,数据记录按照插入顺序存储,没有特定的排序。每条记录都有一个行号(Row Number),可以根据行号直接访问记录。 -
索引文件(.MYI): MyISAM 将索引信息存储在
.MYI文件中,索引都是二级索引。- MyISAM 的 B+ 树索引的叶子节点存储的是索引列的值和行号。
-
特点:
-
索引与数据分离:MyISAM 的索引和数据是分开存储的。
-
回表操作:通过索引查找记录时,需要根据索引叶子节点中存储的行号到数据文件中定位记录。由于行号是物理地址,这种回表操作通常比 InnoDB 的回表操作更快(因为 InnoDB 的回表是逻辑上的,需要通过聚簇索引树)。
-
MyISAM 不支持聚簇索引。
-
6. MySQL 中创建和删除索引的语句
-
创建索引:
-- 方法一:在创建表时指定索引 CREATE TABLE table_name (column1 datatype,column2 datatype,...,INDEX index_name (column1, column2, ...) -- 单列索引或联合索引 );-- 方法二:使用 ALTER TABLE 语句添加索引 ALTER TABLE table_name ADD INDEX index_name (column1, column2, ...); ALTER TABLE table_name ADD UNIQUE index_name (column1, column2, ...); --唯一索引 ALTER TABLE table_name ADD PRIMARY KEY (column1); -- 主键,自动创建聚集索引-- 方法三: 使用 CREATE INDEX CREATE INDEX index_name ON table_name (column_list); -
删除索引:
-- 方法一:使用 ALTER TABLE 语句删除索引 ALTER TABLE table_name DROP INDEX index_name;--方法二: 使用 DROP INDEX DROP INDEX index_name ON table_name;
B+ 树索引的使用
1. 索引的代价
虽然索引可以显著提高查询性能,但它们并非没有代价。
-
空间代价: 每个索引都对应一棵 B+ 树,会占用额外的存储空间。索引越多,占用的空间越大。
-
时间代价: 对表进行数据插入、删除和更新操作时,MySQL 需要维护所有相关的索引树。这会增加数据修改操作的时间开销。索引越多,维护开销越大。
- 尤其是对于频繁更新的列,索引的维护成本可能很高。
2. B+ 树索引适用的条件
只有在合适的查询条件下,B+ 树索引才能发挥其优势。
-
全值匹配(Exact Match):
-
当查询条件中的列与索引列完全匹配,并且按照索引列的顺序出现时,可以使用索引。
-
例如,对于索引
idx_col1_col2,查询WHERE col1 = 'a' AND col2 = 'b'可以使用索引。 -
与索引中列的声明顺序有关,where的条件顺序可以随意,优化器会进行调整
-
-
匹配左边的列(Leftmost Prefix Rule):
-
对于联合索引,查询条件可以只包含索引的左边连续的列。
-
例如,对于索引
idx_col1_col2_col3,以下查询可以使用索引:-
WHERE col1 = 'a' -
WHERE col1 = 'a' AND col2 = 'b' -
WHERE col1 = 'a' AND col2 = 'b' AND col3 = 'c'
-
-
但是,以下查询不能使用索引:
-
WHERE col2 = 'b'(缺少最左边的 col1) -
WHERE col1 = 'a' AND col3 = 'c'(col2 不连续)
-
-
-
匹配列前缀(Prefix Match):
-
对于字符串类型的索引列,可以使用
LIKE操作符进行前缀匹配。 -
例如,对于索引
idx_name,查询WHERE name LIKE 'abc%'可以使用索引。 -
但是,
WHERE name LIKE '%abc'或WHERE name LIKE '%abc%'不能使用索引(后缀匹配或中间匹配)。
-
-
匹配范围值(Range Query):
-
可以使用索引进行范围查询,但只有最左边的列可以进行范围查询。
-
例如,对于索引
idx_col1_col2,查询WHERE col1 > 'a' AND col1 < 'z'可以使用索引。 -
但是,查询
WHERE col1 = 'a' AND col2 > 10只有 col1 可以使用索引,col2 无法使用索引进行范围过滤。
-
-
精确匹配某一列并范围匹配另外一列:
- 这是范围查询的一种特殊情况。如果最左边的列是精确匹配,而后面的列是范围匹配,则索引仍然可以使用。
-
用于排序(ORDER BY):
-
如果
ORDER BY子句中的列与索引列的顺序完全一致,MySQL 可以利用索引直接进行排序,避免额外的排序开销(Using filesort)。 -
例如,对于索引
idx_col1_col2,查询SELECT * FROM table_name ORDER BY col1, col2可以使用索引排序。 -
如果
ORDER BY子句中的列顺序与索引列顺序不同,或者包含非索引列,则无法使用索引排序。ORDER BY多个列排序要保证顺序和索引列一致(都是ASC或DESC)。
-
-
用于分组(GROUP BY):
-
GROUP BY子句的原理与ORDER BY类似。如果GROUP BY子句中的列与索引列的顺序完全一致,MySQL 可以利用索引进行分组,提高分组操作的效率。 -
如果联合索引是(a,b),则
GROUP BY b无法使用索引。
-
3. 回表的代价
-
回表操作: 当使用二级索引进行查询时,如果查询的列不全在二级索引中,MySQL 需要根据二级索引中获取到的主键值,回到聚簇索引中查找完整的记录。这个过程称为回表。
-
性能影响:
-
回表操作会增加磁盘 I/O 次数。
-
如果二级索引返回的主键值在聚簇索引中是离散分布的,回表操作会导致大量的随机 I/O,性能较差。
-
如果二级索引返回的主键值在聚簇索引中是连续分布的(例如,按照时间范围查询),回表操作可以利用顺序 I/O,性能相对较好。
-
回表的记录数越多,性能越低。
-
4. 覆盖索引(Covering Index)
-
定义: 如果一个索引包含了查询所需的所有列,我们就称之为覆盖索引。
-
优势: 使用覆盖索引可以避免回表操作,直接从索引中获取所需的数据,极大地提高查询性能。
-
如何使用: 在设计查询语句时,尽量只选择需要的列,并确保这些列都包含在索引中。
5. 如何挑选索引
为表创建合适的索引是数据库优化的关键。以下是一些建议:
-
只为用于搜索、排序或分组的列创建索引: 不要为查询中不涉及的列创建索引。避免为那些只在 select 列表中,但不在 where、order by 或 group by 子句中使用的列创建索引。
-
考虑列的基数(Cardinality): 列的基数是指该列中不同值的数量。基数越高,索引的选择性越好,索引的效果越明显。例如,性别列(男、女)的基数很低,不适合创建索引;而身份证号列的基数很高,非常适合创建索引。
-
索引列的类型尽量小: 较小的数据类型通常意味着更少的存储空间和更快的比较速度,这可以减少索引占用的空间,提高索引的效率。
-
索引字符串值的前缀(Prefix Index): 对于较长的字符串列,可以只对字符串的前几个字符创建索引,而不是对整个字符串创建索引。这可以节省存储空间,并提高索引的效率。
-
例如:
ALTER TABLE table_name ADD INDEX idx_name (name(10));// 对 name 列的前 10 个字符创建索引 -
需要仔细权衡前缀的长度,确保前缀的选择性足够好。
-
-
让索引列在比较表达式中单独出现: 如果索引列参与了表达式计算或函数调用,MySQL 将无法使用索引。
- 例如:
WHERE col1 * 2 = 10无法使用索引,而WHERE col1 = 10 / 2可以使用索引。
- 例如:
-
主键插入顺序: 对于 InnoDB 表,建议使用自增列(
AUTO_INCREMENT)作为主键。这样可以保证新的数据行被插入到表的末尾,减少页面分裂和碎片,提高插入性能。 -
避免冗余和重复索引:
-
冗余索引: 如果已经存在一个联合索引 (col1, col2),那么再创建一个单列索引 (col1) 就是冗余的,因为联合索引已经可以覆盖单列索引的功能。
-
重复索引: 不要对同一列创建多个类型相同的索引。
-
6. 索引的类型
除了 B+ 树索引外,MySQL 还支持其他类型的索引:
-
哈希索引(Hash Index):
-
基于哈希表实现,只适用于等值查询(
=,IN),不支持范围查询。 -
哈希索引的查找速度非常快(通常为 O(1)),但不支持排序。
-
InnoDB 引擎不支持手动创建哈希索引,它有一个“自适应哈希索引”(Adaptive Hash Index)的功能,会根据查询模式自动创建和管理哈希索引。
-
Memory 存储引擎支持显式创建哈希索引。
-
-
全文索引(Full-Text Index):
-
用于全文搜索,可以对文本内容进行分词和匹配,支持模糊查询。
-
适用于
MATCH AGAINST语法。 -
MyISAM 和 InnoDB(5.6 版本及以后)都支持全文索引。
-
-
空间索引 (Spatial Index):
-
用于对地理空间数据类型 (如
POINT,LINESTRING,POLYGON) 进行索引,支持空间查询。 -
使用
SPATIAL关键字。 -
MyISAM 和 InnoDB 都支持。
-
7. 索引的维护
-
索引重建: 随着数据的不断插入、删除和更新,索引可能会产生碎片,导致性能下降。定期重建索引可以优化索引结构,提高查询性能。
- 可以使用
ALTER TABLE table_name ENGINE=InnoDB;或OPTIMIZE TABLE table_name;来重建索引。
- 可以使用
-
索引优化: 根据查询需求和数据分布,定期评估和调整索引列、索引类型以及索引的顺序。
-
索引监控:
-
使用 MySQL 的性能模式(Performance Schema)或慢查询日志(Slow Query Log)监控索引的使用情况。
-
分析查询的执行计划(
EXPLAIN语句),查看是否使用了正确的索引。
-
8. 查询优化器(Query Optimizer)
-
查询优化器的作用: MySQL 的查询优化器负责分析 SQL 查询语句,并选择最优的执行计划。这包括选择合适的索引、决定表的连接顺序、选择合适的访问方法等。
-
影响因素: 查询优化器的决策受到多种因素的影响,包括表结构、索引、数据分布、查询条件、统计信息等。
-
优化建议:
-
使用
EXPLAIN语句查看查询的执行计划,了解 MySQL 如何执行查询。 -
根据执行计划的结果,调整查询语句、修改索引或更新统计信息,以帮助优化器选择更优的执行计划。
-
使用查询提示(Query Hints)可以干预优化器的决策(例如,
FORCE INDEX强制使用某个索引)。
-
9. 索引的限制
-
索引数量: 虽然可以为一个表创建多个索引,但过多的索引会增加存储空间和维护成本,影响数据修改操作的性能。建议根据实际需求创建索引,避免创建不必要的索引。
-
索引长度: 索引列的长度越长,索引占用的空间越大,索引的效率也可能降低。对于较长的字符串列,可以考虑使用前缀索引。
-
索引列的选择: 选择合适的列作为索引列非常重要。一般来说,选择性高(基数大)、经常用于查询条件、排序或分组的列更适合创建索引。避免在频繁更新的列上创建索引。
10. 实际应用案例
-
电商系统:
-
商品表:为商品名称、商品分类、商品 ID、价格等列创建索引,以提高商品搜索、筛选和排序的性能。
-
订单表:为订单 ID、用户 ID、下单时间等列创建索引,以提高订单查询和统计的性能。
-
-
日志系统:
- 日志表:为时间戳、日志级别、错误信息等列创建索引,以提高日志查询、分析和过滤的性能。
-
社交网络:
-
用户表:为用户 ID、用户名、注册时间等列创建索引,以提高用户查找和登录的性能。
-
关系表:为用户 ID、好友 ID 创建联合索引,以提高好友关系查询的性能。
-
动态表:为用户 ID、发布时间、内容等列创建索引,以提高动态内容检索和推荐的性能。
-
总结
-
B+ 树索引: InnoDB 存储引擎默认的索引类型,适用于快速查询、排序和分组。但是要注意索引的空间和时间代价。
-
索引使用: 掌握 B+ 树索引的适用条件,合理选择索引列,避免冗余和重复索引,使用覆盖索引提高性能。
-
索引维护: 定期重建和优化索引,监控索引的使用情况,确保查询性能。
-
查询优化器: 了解查询优化器的作用,利用
EXPLAIN语句分析查询执行计划,并根据需要进行调整。 -
最佳实践: 没有"银弹"索引,需要结合业务场景、数据特点、查询模式综合考虑来创建和维护索引。
相关文章:
mysql之B+ 树索引 (InnoDB 存储引擎)机制
b树索引机制 B 树索引 (InnoDB 存储引擎)机制**引言:****1. 数据页结构与查找**2. 索引的引入**3. InnoDB 的 B 树索引****4. InnoDB B 树索引的注意事项****5. MyISAM 的索引方案 (选读,与 InnoDB 做对比)****6. MySQL 中创建和删除索引的语句** **B 树…...
Spring Boot定时任务原理
Spring Boot定时任务原理 在现代应用中,定时任务的调度是实现周期性操作的关键机制。Spring Boot 提供了强大的定时任务支持,通过注解驱动的方式,开发者可以轻松地为方法添加定时任务功能。本文将深入探讨 Spring Boot 中定时任务的实现原理…...
MySQL 架构
目录 1. MySQL 架构概览 (1) 客户端/服务器架构 (2) 存储引擎架构 2. 主要组件 (1) 客户端工具 (2) MySQL 服务器 (3) 存储引擎 3. MySQL 架构图 4. MySQL 架构的特点 5. MySQL 的高级架构 (1) 主从复制(Master-Slave Replication) (2) 主主…...
Unity 聊天气泡根据文本内容适配
第一步 拼接UI 1、对气泡图进行九宫图切割 2、设置底图pivot位置和对齐方式 pivot位置:(0,1) 对齐方式:左上对齐 3、设置文本pivot位置和对齐方式,并挂上布局组件 pivot设置和对齐方式和底图一样&#…...
ok113i平台——usb触摸屏驱动开发
在嵌入式Linux系统中,如果USB触摸屏能够检测到并且在手指移动时有数据,但点击无法触发,这可能是因为触摸屏驱动或配置的问题。以下是一些可能的解决方法: 1. 确认驱动支持 首先,确保您使用的触摸屏驱动程序完全支持您…...
AI 百炼成神:逻辑回归, 垃圾邮件分类
第二个项目:逻辑回归垃圾邮件分类 项目代码下载地址:https://download.csdn.net/download/m0_56366541/90398247 项目目标 学习逻辑回归的基本概念。使用逻辑回归算法来实现垃圾邮件的分类。理解如何处理文本数据以及如何评估分类模型的性能。项目步骤 准备数据集 我们将使…...
【Unity】Unity clone 场景渲染的灯光贴图异位问题
Unity clone 场景渲染的灯光贴图异位问题 问题 需要将一个场景clone 一份保存到本地 当克隆完成后,副本场景的灯光贴图异位了,与原场景存在较大的差别 问题原因 场景被clone 后,场景的灯光渲染数据不能共用,即Lightmapping.li…...
Android Studio安装配置及运行
一、下载Android Studio 官网下载:下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 跳转到下载界面,选择同意条款,并点击下载,如图: 二、详细安装 双击下载的文件 三、配置Android Studio …...
运维脚本——9.配置漂移检测
场景:检测服务器配置与基准配置的差异,防止未经授权的修改。 示例:使用Ansible Playbook对比当前配置与标准模板。 - hosts: alltasks:- name: Check SSH configuration against baselineansible.builtin.diff:path: /etc/ssh/sshd_configori…...
FTP 实验(ENSP模拟器实现)
FTP 概述 FTP(File Transfer Protocol,文件传输协议)是一种用于在网络上进行文件传输的标准协议。它允许用户在两台计算机之间上传和下载文件。 1、FTP采用客户端-服务器模型,客户端通过FTP客户端软件,连接到FTP服务…...
基于 DeepSeek + Gemeni 打造 AI+前端的多人聊天室
开源项目 botgroup.chat 介绍 AI 多人聊天室: 一个基于 React 和 Cloudflare Pages(免费一键部署) 的多人 AI 聊天应用,支持多个 AI 角色同时参与对话,提供类似群聊的交互体验。体验地址:https://botgroup.chat 开源仓库&#x…...
rust笔记5-derive属性2
在 Rust 中,derive 是一种自动为结构体或枚举实现特定 trait 的机制。通过 #[derive(...)] 属性,Rust 编译器可以自动生成一些常见 trait 的实现代码,从而减少手动编写重复代码的工作量。 以下是对 Copy、Clone、Hash 和 Default 这几个常用 trait 的详细介绍和示例: 1. C…...
【电机控制器】ESP32-C3语言模型——豆包
【电机控制器】ESP32-C3语言模型——豆包 文章目录 [TOC](文章目录) 前言一、简介二、代码三、实验结果四、参考资料总结 前言 使用工具: 提示:以下是本篇文章正文内容,下面案例可供参考 一、简介 二、代码 #include <WiFi.h> #inc…...
Flask实现高效日志记录模块
目录 一. 简介: 1. 为什么需要请求日志 二. 日志模块组成 1. 对应日志表创建(包含日志记录的关键字段) 2. 编写日志记录静态方法 3. 在Flask中捕获请求日志 4. 捕获异常并记录错误日志 5. 编写日志接口数据展示 6. 写入数据展…...
基于python深度学习遥感影像地物分类与目标识别、分割
我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB,遥感大数据时…...
Spring有哪些缺点?
大家好,我是锋哥。今天分享关于【Spring有哪些缺点?】面试题。希望对大家有帮助; Spring有哪些缺点? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring框架是一个广泛使用的企业级Java开发框架,提供了丰富的功能和强大的灵…...
linux学习【7】Sourc Insight 4.0设置+操作
目录 1.Source Insight是什么?2.需要哪些配置?3.怎么新建项目4.一些问题的解决1.中文乱码问题 5.常规使用1. 在工程中打开文件2. 在文件中查看函数或变量的定义3. 查找函数或变量的引用4. 快捷键 按照这个设置就可以了,下面的设置会标明设置理…...
dify实现分析-rag-关键词索引的实现
概述 在dify中有两种构建索引的方式,一种是经济型,另一种是高质量索引(通过向量数据库来实现)。其中经济型就是关键词索引,通过构建关键词索引来定位查询的文本块,而关键词索引的构建是通过Jieba这个库来完…...
PHP2(WEB)
##解题思路 打开页面什么线索都没有,目录扫描只是扫出来一个index.php,而源代码没有东西,且/robots.txt是不允许访问的 于是一番查询后发现,有个index.phps的文件路径,里头写着一段php的逻辑,对url的id参数…...
黑盒测试、白盒测试、单元测试、集成测试、系统测试、验收测试的区别与联系
黑盒测试 vs. 白盒测试 vs. 其他测试类型(单元测试、集成测试、系统测试、验收测试)的区别与联系 一、黑盒测试(Black-box Testing) 定义:不关心代码内部实现,只关注输入和输出是否符合预期。特点&#x…...
Halcon 3D加快表面匹配速度
文章目录 gen_box_object_model_3d 创建一个代表盒子的 3D 物体模型write_surface_model — 将表面模型写入文件read_surface_model — 将表面模型读取prepare_object_model_3d - 为某个操作准备三维对象模型select_points_object_model_3d - 对 3D 物体模型的属性应用阈值。se…...
Linux系统编程之高级信号处理
概述 在前一篇文章中,我们介绍了signal函数、sigaction函数等基本的信号处理方法。在本篇中,我们将介绍信号处理的一些高级用法,包括:阻塞与解除阻塞、定时器等。 阻塞与解除阻塞 有时候,我们不希望某个信号立即被处理…...
Ollama 本地GUI客户端:为DeepSeek用户量身定制的智能模型管理与交互工具
Ollama 本地GUI客户端:为DeepSeek用户量身定制的智能模型管理与交互工具 相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例…...
基于SSM的《计算机网络》题库管理系统(源码+lw+部署文档+讲解),源码可白嫖!
摘 要 《计算机网络》题库管理系统是一种新颖的考试管理模式,因为系统是用Java技术进行开发。系统分为三个用户进行登录并操作,分别是管理员、教师和学生。教师在系统后台新增试题和试卷,学生进行在线考试,还能对考生记录、错题…...
对Revit事务机制的一些推测
什么是事务机制 首先,什么是事务机制。软件事务机制是指一种在软件系统中用于管理一系列操作的方法,这些操作要么全部成功完成,要么全部失败,不会出现部分完成的情况。事务机制确保了数据的一致性和完整性,特别是在并…...
软件架构设计:网络基础
一、计算机网络概述 计算机网络的定义 计算机网络是通过通信设备和线路将分散的计算机系统连接起来,实现资源共享和信息传递的系统。 计算机网络的分类 按覆盖范围:局域网(LAN)、城域网(MAN)、广域网&…...
《微软量子芯片:开启量子计算新纪元》:此文为AI自动生成
量子计算的神秘面纱 在科技飞速发展的今天,量子计算作为前沿领域,正逐渐走进大众的视野。它宛如一把神秘的钥匙,有望开启未来科技变革的大门,而微软量子芯片则是这把钥匙上一颗璀璨的明珠。 量子计算,简单来说,是一种遵循量子力学规律调控量子信息单元进行计算的新型计算…...
RocksDB Bloom Filter 如何避免假阳性问题探索
1. 引言:Bloom Filter 的机遇与挑战 Bloom Filter 是数据库系统中广泛使用的概率数据结构,它通过极小的内存开销快速判断一个键是否可能存在于磁盘文件中(如 LSM-Tree 的 SSTable)。然而,其核心缺陷是存在假阳性&…...
SpringBoot+Vue+Mysql苍穹外卖
一.项目介绍 1.项目内容 苍穹外卖是一款为大学学子设计的校园外卖服务软件,旨在提供便捷的食堂外卖送至宿舍的服务。该软件包含系统管理后台和用户端(微信小程序)两部分,支持在线浏览菜品、添加购物车、下单等功能,并…...
网络运维学习笔记 018 HCIA-Datacom综合实验02
文章目录 综合实验2sw3:sw4:gw:core1(sw1):core2(sw2):ISP 综合实验2 sw3: vlan 2 stp mode stp int e0/0/1 port link-type trunk port trunk allow-pass v…...
