当前位置:  开发笔记 > 编程语言 > 正文

在GQL中计算结果的最佳方法是什么?

如何解决《在GQL中计算结果的最佳方法是什么?》经验,为你挑选了3个好方法。

我认为计算的一种方法是这样的:

foo = db.GqlQuery("SELECT * FROM bar WHERE baz = 'baz')
my_count = foo.count()

我不喜欢的是我的数量将限制在1000以上,我的查询可能会很慢.那里的人有解决方法吗?我有一个想法,但它感觉不干净.如果只有GQL有一个真正的COUNT函数......



1> Jehiah..:

在使用像GAE这样的可扩展数据存储区时,您必须提前考虑进行计算.在这种情况下,这意味着您需要为每个计数器保留计数器,baz并在添加新bar计数时递增它们,而不是在显示时计数.

class CategoryCounter(db.Model):
    category = db.StringProperty()
    count = db.IntegerProperty(default=0)

然后在创建Bar对象时,递增计数器

def createNewBar(category_name):
  bar = Bar(...,baz=category_name)

  counter = CategoryCounter.filter('category =',category_name).get()
  if not counter:
    counter = CategoryCounter(category=category_name)
  else:
    counter.count += 1
  bar.put()
  counter.put()

db.run_in_transaction(createNewBar,'asdf')

现在,您可以轻松获取任何特定类别的计数

CategoryCounter.filter('category =',category_name).get().count



2> zgoda..:

给耶和华的回应+1.

在GAE上获取对象计数器的官方和祝福方法是构建分片计数器.尽管声名鹊起,但这非常简单.


失去基于每个用户跟踪计数器的能力使得清除垃圾邮件发送者变得更加困难.使用分片计数器时如何解决此问题?

3> Nick Johnson..:

所有数据库中的计数函数都很慢(例如,O(n)) - GAE数据存储区使这一点变得更加明显.正如Jehiah建议的那样,您需要将计算出的计数存储在实体中,如果您想要可伸缩性,请参考该计数.

这并不是App Engine独有的 - 其他数据库只是更好地隐藏它,直到你试图用每个请求计算成千上万条记录,并且你的页面渲染时间开始呈指数增长...


它并不总是很慢 - 有些人会为你维护分片计数器,期望像SELECT COUNT(*)FROM MyTable这样的查询.(IIRC,MySQL中的MyISAM就是这样做的.)而且你的页面渲染时间只会线性增加,而不是指数增长.如果它真的是指数级的,你会在数百条记录之后看到它,而不必等待数万条记录.
推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有