稀疏/密集索引及其工作原理?

时间:2017-06-06 23:44:44

标签: mongodb indexing b-tree database

通过搜索树,我可以理解B * Tree索引是如何工作的。

但是,我无法理解稀疏索引或密集索引是如何工作的。

例如,如果密集索引需要通过键映射每个值。当你进行搜索时它会如何受益?

添加更多说明:
这个备用/密集索引是指wiki上描述的索引: https://en.wikipedia.org/wiki/Database_index#Sparse_index

根据我的理解,索引的工作原理是您可以将B *树搜索为O(logN),而不是将每个块搜索为O(N)

但是,从稀疏索引或密集索引的描述。 我无法看到它对搜索有什么好处,你通过键搜索?但是,密钥的价值与价值相同吗? (对于密集指数,它严格相等)

我猜测的是密集索引和稀疏索引只是B * Tree中使用的索引。但是,我不确定我是否理解正确。因为,我无法在网上找到任何确认我的想法。

1 个答案:

答案 0 :(得分:0)

块级稀疏索引

块级稀疏索引仅对索引也为clustered的查询有用(即索引的排序顺序表示磁盘上数据的位置)。块级稀疏索引将具有较少的值,但在开始顺序扫描之前仍可用于查找大致位置。在这种情况下,稀疏性实际上是“在聚簇索引中索引每个 n 值。”

从搜索的角度来看,块级稀疏索引查询将:

  • 找到小于或等于您的索引搜索条件的最大密钥(正常B-tree Big O time complexityO(log N)用于搜索)
  • 使用该密钥作为聚集索引的顺序扫描的起点(O(N)进行搜索)

稀疏块级索引的优点主要在于大小而不是速度:当密集索引(包括所有值)不能时,较小的稀疏索引可能适合内存。聚簇索引上基于范围的查询已经返回顺序结果,因此稀疏索引可能具有一些优势,只要索引不太稀疏就无法有效支持常见查询。

包含重复键的记录的聚簇索引实际上是稀疏索引的一个示例:不需要使用相同的值索引每个单独记录的偏移量,因为聚簇索引的逻辑顺序与数据

有关工作示例,请参阅:Dense and Sparse Indices(sfu.ca)。

带有sparse选项的

MongoDB索引
  

我仍然无法弄清楚稀疏索引在MongoDB中是如何工作的。例如,您有N个值,字段x不为空。然后你会有N键。那么密钥如何帮助您进行搜索?

具有sparse option的MongoDB索引仅包含具有索引字段的文档的条目。 MongoDB具有灵活的模式,因此不需要为集合中的所有文档提供字段(或相同类型)。注意:可选document validation是MongoDB 3.2 +的一项功能。

默认情况下,集合中的所有文档都将包含在索引中,但那些没有索引字段的文档将存储null值。如果MongoDB集合中的所有文档都具有索引字段的值,则默认索引与具有sparse选项的索引之间没有区别。

这实际上是partial index的特例:稀疏性是指将索引值的范围限制为仅包含非空条目。索引方法在其他方面与非稀疏索引相同。

MongoDB文档用一个注释来调用它:

  

不要将MongoDB中的稀疏索引与其他数据库中的block-level索引混淆。将它们视为具有特定过滤器的密集索引。