$regex查询慢的原因,大部分是没有命中索引,如果需要命中索引有两点需要注意
1) 不能区分大小写 ,不要指定"$options":"i"
"$options":"i"
2)必须指定开头情况,才能使用索引
{"text":{"$regex":"^str"}}
{"text":{"$regex":"^(?!str)"}}
对于区分大小写的正则表达式查询,如果字段存在索引,那么MongoDB将正则表达式与索引中的值进行匹配,这可能比集合扫描快。如果正则表达式是“prefix expression”,这意味着所有潜在的匹配都以同一字符串开头,则可以进行进一步的优化。这允许MongoDB从该前缀构造一个“范围”,并且只与索引中属于该范围的值匹配。
如果正则表达式以插入符号(^)或左锚点(\A)开头,后跟一系列简单符号,则它是“前缀表达式”。例如,正则表达式/^abc.*/将通过仅与以abc开头的索引中的值匹配来优化。
此外,/^a/、/^a./和/^a./速度较慢。/^a/可以在匹配前缀后停止扫描。
不区分大小写的正则表达式查询通常不能有效地使用索引。$regex实现不支持排序规则,因此无法使用不区分大小写的索引。
文章转载自后端Q,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




