Mongodb低基数索引

Web*_*ter 5 indexing mongodb

从sql背景我知道

索引的基数是其中唯一值的数量。您的数据库表中可能有 10 亿行,但如果这些行中只有 8 个唯一值,则基数非常低。

低基数索引并不是主要的效率增益。大多数 SQL 索引都是二叉搜索树(B 树)。与连续扫描表中的每一行以查找匹配约束相比,B 树以对数方式减少了必须进行的比较次数。当树的大小很小时,对 B 树执行搜索的收益非常低。

那么在布尔字段上放置索引吗?或者枚举值字段?大量行中极少数不同值的基数不会产生显着的效率提升。保存基数非常高的字段的数据库索引,以确保扫描 B 树的收益与顺序扫描相比最大。

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

The*_*eff 6

是的,MongoDB也有同样的问题,它使用B树来建立索引。因此,索引的低基数值会出现性能问题。

\n\n

这是一篇关于它的好文章

\n\n

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

\n\n

尽管没有简单或受支持的解决方案,但它为特定情况提供了一些选项:

\n\n
\n
    \n
  • 您对分布不均匀的布尔字段运行查询,并且主要查找频率较低的值
  • \n
  • 您的基数字段较低,并且大多数查询都会查找值的子集
  • \n
  • 大多数查询都会查找字段中值的有限子集
  • \n
  • 你没有\xe2\x80\x99没有足够的内存来存储非常大的索引\xe2\x80\x93例如,你有很多页面从WiredTiger缓存中驱逐
  • \n
\n
\n