mongodb - Mongodb低基数指数
问题描述
从sql背景我知道
索引的基数是其中唯一值的数量。您的数据库表中可能有十亿行,但如果这些行中只有 8 个唯一值,则您的基数非常低。
低基数指数不是主要的效率增益。大多数 SQL 索引都是二叉搜索树(B-Trees)。与对表中的每一行进行串行扫描以查找匹配约束相比,B 树以对数方式减少了必须进行的比较次数。当树的大小很小时,对 B 树执行搜索的收益非常低。
那么在布尔字段上放置索引?还是枚举值字段?大量行中的极少数不同值的基数不会产生明显的效率增益。为具有非常高基数的字段保存数据库索引,以确保扫描 B 树的收益与顺序扫描相比最大。
mongodb呢?我们必须在经常过滤的低基数字段上创建索引吗?例如具有 4 个状态的枚举字段
解决方案
是的,MongoDB 也有同样的问题,它使用 B-Trees 进行索引。因此,带有索引的低基数值会出现性能问题。
这是一篇关于它的好文章
https://www.percona.com/blog/2018/12/19/using-partial-and-sparse-indexes-in-mongodb/
尽管没有简单或受支持的解决方案,但它为特定情况提供了一些选项:
- 您在分布不均匀的布尔字段上运行查询,并且您主要寻找不太频繁的值
- 您的基数字段较低,并且大多数查询都在寻找值的子集
- 大多数查询在字段中查找有限的值子集
- 你没有足够的内存来存储非常大的索引——例如,你有很多来自 WiredTiger 缓存的页面驱逐
推荐阅读
- python - ValueError:无法挤压暗淡 [1],预期尺寸为 1,输入形状为 '{{node ctc/Squeeze}} 得到 3:[?,3]
- javascript - 如何读取txt文件并将其保存在html中javascript中的数组中
- javascript - 如何在地图中获取 X 项?
- c++ - 错误 LNK2001:Visual Studio 2019 中未解析的外部符号 CWbemProviderGlue::FrameworkLogoffDLL(wchar_t const *)"
- google-sheets - 在谷歌表格中,有没有办法将两个不同表格中的列组合成饼图?
- jquery - 我想验证年或月输入字段
- angular - 为什么扁平化 ES 模块 (FESM) 比非扁平化 ES 模块 (ESM) 性能更高?
- docker - 如何摆脱仅在映像构建中使用而不在运行时使用的 docker-compose 空变量警告?
- mysql - 使用“mysqldump”从 Datagrip 转储数据库
- java - 无法加载类“org.gradle.internal.impldep.com.google.common.collect.Lists”