使用正则查询非指定前缀字符串时如何触发索引生效
问题原因
MongoDB的B树索引仅支持正向前缀正则查询走索引,$not 包裹的前缀正则属于否定查询,无法直接匹配B树的正向范围检索逻辑,因此会触发全表扫描,耗时大幅上升。
可用解决方案
- 方案1:用字典序范围查询替代否定正则(优先推荐)
利用字符串字典序的特性,所有不以abcd为前缀的值,要么字典序小于abcd,要么大于等于前缀的下一个连续值abce,改写后的查询语句如下,可直接命中field字段的普通索引:
如果需要包含{"$or": [{"field": {"$lt": "abcd"}}, {"field": {"$gte": "abce"}}]}field为空的记录,在$or数组中新增{"field": null}即可。 - 方案2:新增前缀预计算字段
新增专门存储field前4位的计算字段field_prefix_4,写入时预计算赋值并为该字段创建索引,查询时直接用以下语句即可:
该方案在字段前缀分布均匀的场景下,索引扫描效率远高于全表扫描。{"field_prefix_4": {"$ne": "abcd"}} - 方案3:分片集群场景下配置分片键
若使用分片集群,可以将该字段的前缀作为分片键的组成部分,查询时可直接路由排除存储abcd前缀数据的分片,跳过整分片数据扫描,性能提升更明显。
内容的提问来源于stack exchange,提问作者Saw
相关产品推荐
相关产品推荐

