alo*_*loo 9 random google-app-engine gql google-cloud-datastore
我正在尝试编写一个返回特定类型的N个随机记录的GQL查询.我当前的实现工作但需要N次调用数据存储区.如果可能的话,我想对数据存储区进行1次调用.
我目前为我放入数据存储区的每种类型分配一个随机数.当我查询随机记录时,我生成另一个随机数并查询记录> rand ORDER BY asc LIMIT 1.
这是有效的,但它只返回1条记录,所以我需要进行N次查询.关于如何进行这一查询的任何想法?谢谢.
"在引擎盖下"单个搜索查询调用只能从某个索引返回一组连续的行.这就是为什么一些GQL查询(包括任何使用!=)扩展到多个数据存储区调用的原因.
N个独立的均匀随机选择在任何索引中都不是(通常)连续的.
QED.
您可以使用memcache来存储实体,并降低获取N个实体的成本.或者,如果您不介意索引中的"随机"选择在一起,请在一个查询中选择随机选择的(例如)100块,然后从中随机选择N. 由于您有一个已经随机化的字段,因此对于局外人而言,N个项目是相关的并不是显而易见的.至少,直到他们查看大量样本并注意到项目A和Z从未出现在同一组中,因为它们在随机索引中相距超过100.如果性能允许,您可以不时地重新随机化您的实体.
你在寻找什么样的权衡?如果您愿意在插入这些实体时遇到小的性能影响,您可以创建一个解决方案来快速获得N个.
这是你需要做的:
插入实体时,请指定密钥.您希望按顺序为实体提供密钥,从1开始,然后从那里开始.(这需要一些努力,因为app引擎没有自动增量()所以你需要跟踪你在其他实体中使用的最后一个id,让我们称之为IdGenerator)
现在,当你需要N个随机实体时,生成1个和你生成的最后一个id之间的N个随机数(你的IdGenerator会知道这个).然后,您可以使用N键进行批量获取,这只需要一次访问数据存储区,并且也会比查询更快,因为密钥获取通常比查询AFAIK更快.
这种方法确实需要处理一些恼人的细节:
所以问题归结为你需要多快这些N项与你添加和删除它们的频率,以及是否有一点额外的复杂性值得提升性能.
| 归档时间: |
|
| 查看次数: |
4995 次 |
| 最近记录: |