面试题答案
一键面试计算索引基数的基本方法
在MongoDB中,可以使用collStats
命令来获取集合的统计信息,其中包括索引的基数相关信息。例如:
db.collection_name.stats().indexCounters.forEach(function(index) {
print(index.key, index.accesses, index.size, index.count);
});
这里的index.count
近似表示索引的基数,即索引键的唯一值数量。另外,也可以通过explain
执行计划来间接观察基数对查询的影响,explain
输出中可能包含有关索引选择性(与基数相关)的信息。
基数对查询性能的影响
- 高基数索引:
- 优点:当索引基数较高时,索引能够更有效地过滤数据。例如,在用户集合中,以
email
字段建立索引,由于email
基本每个用户都不同,基数高。对于根据email
查询单个用户的操作,MongoDB可以快速定位到所需文档,查询性能高。 - 缺点:但高基数索引会占用更多的磁盘空间和内存,因为需要存储更多不同的键值对。在插入、更新和删除操作时,维护索引的开销也更大。
- 优点:当索引基数较高时,索引能够更有效地过滤数据。例如,在用户集合中,以
- 低基数索引:
- 优点:低基数索引占用空间相对较小,例如在用户集合中,以
gender
字段建立索引,只有“男”“女”两种可能值,基数低。对于一些基于性别进行统计的聚合操作可能有一定帮助。 - 缺点:然而对于查询操作,低基数索引过滤能力弱。比如查询“性别为男的用户”,可能会返回大量文档,MongoDB可能无法利用索引高效定位,查询性能较差。如果基数过低,索引甚至可能不会被查询优化器使用,导致全表扫描。
- 优点:低基数索引占用空间相对较小,例如在用户集合中,以