我在Final
模型(定义如下)中搜索了一个过滤其name
属性的查询。此查询大约需要2200毫秒才能在开发服务器上执行。我怎样才能加快速度?这是一个AppStats screenshot。
我也在created
字段上进行过滤,但这花费了超过10000毫秒,所以我现在已经删除了那部分查询。
class Final(db.Model):
name = db.StringProperty() # 7 characters long
author = db.StringProperty()
rating = db.FloatProperty()
created = db.DateTimeProperty()
# this is the important part of the request (AppStats shows that these two
# queries take about 2200ms each).
query = Final.all()
query2 = Final.all()
query.filter('name = ', link1)
query2.filter('name = ', link2)
aa = query.fetch(10000)
bb = query2.fetch(10000)
答案 0 :(得分:1)
虽然大卫的建议很好,但在开发服务器上优化速度可能是一个坏主意。开发服务器的性能并不反映生产服务器的性能,基于开发服务器运行时的优化在生产中可能效果不佳。
通常,您可以假设开发服务器的性能会随着记录的添加而降低,而生产中的情况绝对不是这样,您的查询运行时仅依赖于结果集的大小。如果您可以减少生产中样本数据集的大小,那么这可能是加快开发的最佳选择。
答案 1 :(得分:0)
您可以通过以下几种方式加快此查询:
将SQLite backend用于开发服务器(可能更快)。
您可以为name
存储整数ID而不是字符串ID吗?这可能会使实体变小,从而减少传输和反序列化的时间。检查整数相等性比字符串相等性更容易,因此数据存储区的执行过滤操作可能更快。
如果name
很大,您可以通过将作者姓名和评级移动到单独的子模型中来节省一些时间。然后,您可以使用祖先查询来获取相关的子模型 - 因此,您只需获取所需的字段,即可节省传输和反序列化时间。