MongoDB低基数索引

5

从sql背景来看,我知道索引的基数是其中唯一值的数量。你的数据库表可能有十亿行数据,但如果这些行中只有8个唯一值,那么你的基数非常低。

低基数索引并没有带来很大的效率提升。大多数SQL索引都是二叉搜索树(B-Tree)。与在表中逐行查找匹配约束相比,B-Tree对必须进行的比较数量进行了对数级别的减少。当树的大小较小时,使用B-Tree执行搜索所获得的收益非常低。

因此,在布尔字段上放置索引?或者枚举值字段?在非常大量的行中只有非常少量不同值的情况下,索引的效率提升将不明显。为了确保扫描B-Tree带来的收益最大,应将数据库索引保存用于具有非常高基数的字段。

那么对于mongodb呢?我们是否必须在经常过滤的低基数字段上创建索引?例如具有4个状态的枚举字段

1个回答

5

是的,MongoDB也存在这个问题,它使用B树进行索引。因此,使用索引时低基数值将会出现性能问题。

这里有一篇好的文章:

https://www.percona.com/blog/2018/12/19/using-partial-and-sparse-indexes-in-mongodb/

尽管没有简单或支持的解决方案,但对于特定情况它给出了一些选项:

  • 您在布尔字段上运行查询,分布不均,并且大多数情况下寻找较不频繁的值
  • 您具有低基数字段,并且大多数查询寻找该值集的子集
  • 大多数查询在字段中寻找有限的值子集
  • 您没有足够的内存来存储非常大的索引-例如,从WiredTiger缓存中有很多页面逐出

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接