从sql背景来看,我知道索引的基数是其中唯一值的数量。你的数据库表可能有十亿行数据,但如果这些行中只有8个唯一值,那么你的基数非常低。
低基数索引并没有带来很大的效率提升。大多数SQL索引都是二叉搜索树(B-Tree)。与在表中逐行查找匹配约束相比,B-Tree对必须进行的比较数量进行了对数级别的减少。当树的大小较小时,使用B-Tree执行搜索所获得的收益非常低。
因此,在布尔字段上放置索引?或者枚举值字段?在非常大量的行中只有非常少量不同值的情况下,索引的效率提升将不明显。为了确保扫描B-Tree带来的收益最大,应将数据库索引保存用于具有非常高基数的字段。
那么对于mongodb呢?我们是否必须在经常过滤的低基数字段上创建索引?例如具有4个状态的枚举字段?