0

我有一个使用 pymongo 的查询,它根据以下内容输出一些值:

cursor = db.collect.find({"index_field":{"$regex":'\s'}}
for document in cursor:
  print document["_id"]

现在这个查询已经运行了很长时间(超过 5 亿个文档),正如我所料。我想知道是否有一种方法可以通过找出最后打印的“_id”在索引字段中的位置来检查查询的执行位置。就像最后打印的 _id 是在 btree 索引的中间吗?快结束了吗?

我想知道这一点只是为了看看我是否应该取消查询并重新优化和/或让它完成,但我无法知道查询中 _id 的位置。

另外,如果有人有办法优化我的空白查询,那将很有帮助。根据文档,如果我使用 ignorecase 似乎会更快,尽管它对空格检查没有意义。

非常感谢,J

4

1 回答 1

1

查询优化

您的查询无法优化,因为它是在文档中$regex寻找空间的低效搜索。\s您可以做的是搜索$regex的前缀\s,例如

db.collect.find({"index_field": {"$regex": '^\\s'}})

查看链接中的注释

索引问题

$regex 只有当正则表达式在字符串的开头(即^)有一个锚点并且是区分大小写的匹配时,才能有效地使用索引。此外,虽然/^a//^a.*//^a.*$/匹配等效字符串,但它们具有不同的性能特征。如果存在适当的索引,则所有这些表达式都使用索引;但是,/^a.*//^a.*$/较慢。 /^a/匹配前缀后可以停止扫描。


DB op的信息

用于db.currentOp()获取有关您所有正在运行的操作的信息。

于 2013-10-07T15:51:25.893 回答