耿腾的博客

常期望安定,还期望即兴。

0%

常见索引结构-0

以下是各种索引算法的简要对比表,包括其原理、性能优势、适用场景和缺点。

索引算法 原理介绍 为什么性能高 适用场景 缺点/性能差的场景
B+ 树 B+ 树是一种平衡多叉树,数据仅存储在叶节点,所有叶节点按顺序连接,适合范围查询和顺序访问。 结构层次分明,叶节点通过链表相连,实现快速范围查找和顺序遍历。 适用于数据库索引、大量顺序读取或范围查询的场景。 高维数据或频繁更新的场景性能较差。插入、删除操作复杂,维护成本高。
倒排索引 建立词项到文档的映射关系,将每个词项关联到出现该词的文档列表,通常用于全文搜索。 通过直接访问词项位置,可快速找到包含该词的所有文档。 适用于文本搜索、日志检索等全文检索场景。 对于非文本数据无效,处理频繁更新的文档集时性能较差,占用内存大。
HNSW HNSW 基于分层的小世界图结构,通过近似最近邻的方法实现高效向量检索。 通过多层图索引和邻居节点搜索,实现快速的近似最近邻查找。 适用于向量相似度检索、推荐系统、图像搜索等高维向量场景。 构建和维护图的成本较高,尤其是频繁更新和插入向量的情况下。对高精度要求场景不适合。
跳表(Skip List) 通过多级链表实现快速搜索,每级链表跳过部分节点,提高查找速度。 基于多级链表,可在 O(log n) 时间内查找目标节点。 适用于键值存储、顺序查询需求的场景,作为简单替代结构。 在超大数据集或高频率更新的场景下不够高效,性能会下降。
LSM 树 LSM 树通过分层排序和合并,将数据写入磁盘前缓存在内存,适合高写入量的场景。 数据批量写入减少随机写的开销,分层合并提升读取效率。 适合写密集型的键值数据库,如 RocksDB、LevelDB。 读性能可能较差,特别是大量读操作时,需通过多层合并查询。
Trie 树 用树结构保存字符串的前缀,每个节点代表一个字符,用于高效的前缀匹配。 可以快速定位字符串的前缀路径,适合匹配和自动补全。 适用于自动补全、前缀匹配等需要快速定位前缀的场景。 占用内存较大,无法很好地处理非字符串数据,不适合范围查询。
Annoy 使用多棵随机 KD 树构建索引,用于近似最近邻查询,查询时从多棵树中查找相似点。 随机生成多棵树,提高查找相似度的效率,查询速度快。 适用于低维度、高性能要求的向量检索,推荐系统等。 处理高维数据时性能较差,存储空间需求大。更新不便。
LSH(Locality-Sensitive Hashing) 将相似数据哈希到相同的桶中,快速找到相似数据的近似最近邻索引方法。 通过哈希实现分桶,减少相似数据查询范围,查询速度快。 适用于低维向量的相似性搜索,处理文本等场景。 高维度数据上效率低,近似度精度差,占用较多内存。

简要总结

  • B+ 树倒排索引 是经典的数据库和全文搜索引擎中常用的索引结构,适合关系型数据和文本数据的检索。
  • HNSWAnnoy 是面向高维向量的近似最近邻索引结构,常用于推荐系统、语义搜索等场景。
  • LSM 树 适合写密集的场景,如键值数据库。
  • Trie 树跳表 更适合简单的键值存储和字符串匹配,但不适合复杂的数据查询和高维向量检索。
  • LSH 在维度较低的数据上表现较好,但对高维数据表现有限。