针对MongoDB特定$or查询的复合索引创建方案咨询
MongoDB索引选择建议
针对你给出的查询语句,先拆解下逻辑:这个$or里只有一组条件,实际等价于同时满足三个范围条件(from_time、to_time、count)和两个精确匹配条件(hash、client)。
先分析你提到的两种方案:
方案一:单复合索引
from_time:1, to_time:1, count:1, hash:1, client:1
完全不推荐。MongoDB的复合索引有个规则:一旦用到范围查询($gte/$lte这类),范围字段之后的索引字段就无法被有效利用。这个索引里前三个都是范围条件,后面的hash和client相当于白加,查询时只能靠前三个字段过滤,剩下的精确匹配还得额外扫描文档,效率很低。方案二:两个独立复合索引
from_time:1, to_time:1, count:1和hash:1, client:1
这个方案是可行的,MongoDB支持索引交集:用第一个索引过滤出符合范围条件的文档,用第二个索引过滤出符合精确匹配的文档,再取两者的交集得到结果。但索引交集的性能通常不如针对性的单复合索引。
更优的索引方案
既然查询是精确匹配+范围查询的组合,最优的复合索引应该把精确匹配的字段放在前面,再跟范围字段,也就是:
hash:1, client:1, from_time:1, to_time:1, count:1
这样查询时,先通过hash和client的精确匹配快速缩小数据范围,再用后面的范围字段进一步过滤,索引利用率最高,性能也最好。
内容的提问来源于stack exchange,提问作者larry ckey
相关产品推荐
相关产品推荐

