如何加速 mongoengine 查询
how to speed up mongoengine queries
如果我有两个对象,例如:
class User(Document):
name = StringField()
following = ListField(ReferenceField('User'))
meta = {
'indexes': [
'following',
]
}
class Media(Document):
owner = ReferenceField('User')
url = StringField()
is_hidden = BooleanField()
posted_date = Date
meta = {
'indexes': [
'owner',
'posted_date',
'is_hidden',
]
}
当我想查找以下未隐藏的情况并且其所有者是我关注的人并且最近发布时,我有这样的查询:
user = User.objects.first()
Media.objects(Q(owner__in=user.following) &
Q(is_hidden=False) &
Q(posted_date__gte=dt.now()-dt.timedelta(days=3))
它没有缩放并且变得越来越慢。我可以做些什么来加快这些类型的复杂查询的性能?
1) 使用User.objects.get(id=user_id)
代替first()
。
虽然我不太确定这是否会有所作为,但我认为是的,这是一个 find
操作,其中 MongoDB 将 return 游标和 mongoengine 迭代到第一个文档。相反,get()
只做一份 findOne
和 return 的 1 个文档。如果我错了,请有人纠正我。
2) 使用 compound index (not multiple single index) since your query is using multiple fields (example here also):
meta = {
'indexes': [
('owner', 'posted_date', 'is_hidden',)
]
}
3) 将 returning 数据限制为您需要的字段,project your fields, using only()
使用explain() on your query to styudy it and improve it in oder to reach a covered query.
如果您计划在生产中使用 mongoengine 处理大型文档,请查看此 post:https://github.com/MongoEngine/mongoengine/issues/1230
我们使用的是 mongoengine,但由于上面 post 中解释的原因,它变得非常慢。
我们最终使用 https://github.com/mongodb/pymodm 重写了整个后端
对于 mongodb 团队来说,这是一个相对较新的项目。我们将它与 Django 一起使用,它的工作速度比使用完全相同的数据库的 mongoengine 快得多。
如果我有两个对象,例如:
class User(Document):
name = StringField()
following = ListField(ReferenceField('User'))
meta = {
'indexes': [
'following',
]
}
class Media(Document):
owner = ReferenceField('User')
url = StringField()
is_hidden = BooleanField()
posted_date = Date
meta = {
'indexes': [
'owner',
'posted_date',
'is_hidden',
]
}
当我想查找以下未隐藏的情况并且其所有者是我关注的人并且最近发布时,我有这样的查询:
user = User.objects.first()
Media.objects(Q(owner__in=user.following) &
Q(is_hidden=False) &
Q(posted_date__gte=dt.now()-dt.timedelta(days=3))
它没有缩放并且变得越来越慢。我可以做些什么来加快这些类型的复杂查询的性能?
1) 使用User.objects.get(id=user_id)
代替first()
。
虽然我不太确定这是否会有所作为,但我认为是的,这是一个 find
操作,其中 MongoDB 将 return 游标和 mongoengine 迭代到第一个文档。相反,get()
只做一份 findOne
和 return 的 1 个文档。如果我错了,请有人纠正我。
2) 使用 compound index (not multiple single index) since your query is using multiple fields (example here also):
meta = {
'indexes': [
('owner', 'posted_date', 'is_hidden',)
]
}
3) 将 returning 数据限制为您需要的字段,project your fields, using only()
使用explain() on your query to styudy it and improve it in oder to reach a covered query.
如果您计划在生产中使用 mongoengine 处理大型文档,请查看此 post:https://github.com/MongoEngine/mongoengine/issues/1230
我们使用的是 mongoengine,但由于上面 post 中解释的原因,它变得非常慢。
我们最终使用 https://github.com/mongodb/pymodm 重写了整个后端 对于 mongodb 团队来说,这是一个相对较新的项目。我们将它与 Django 一起使用,它的工作速度比使用完全相同的数据库的 mongoengine 快得多。