我想知道有没有人能帮我解决这个问题。
我们有一个想法,我们想要实现,但我们目前无法有效地做到这一点。
我已经尽可能地对数据进行了匿名,但结构是相同的。
我们有两个实体,Car和CarJourney。每辆汽车都有0到多个汽车旅行。每辆汽车旅行都有一个与之相关的日期(以及其他属性)--旅行开始的日期。
我想按时间查询汽车旅行的情况。我将有两个时间,一个开始日期和一个结束日期,其中开始日期<= endDate,我想收到这段时间内最近开始的旅程。
因此,如果我脑海中有一个特定的汽车,比如汽车123,我会编写一个查询,它限制了Car.key和Car.startDate,其中Car.key == 123和Journey.startDate >= startDate以及Journey.startDate <= endDate在Journey.startDate上的排序是降序的,限制为1。
例如,A车有3个行程,分别在每月1号、2号和3号。查询开始日期为1日,查询结束日期为2日。这个查询的结果是一次汽车旅行,第二次。
一旦返回该查询的结果,就会进行非常少量的处理来将结果返回给用户。
这就是最简单的部分。
但是,不是超过1辆汽车,我想要一个汽车列表,其中列表包含N个汽车的关键字。
所以,我想运行上面的查询N次,每辆车一次。我要每辆车的最新行程。
因为时间范围是灵活的(因此不能预先知道),所以我们不能实现"isMostRecent“标志,因为虽然目前它可能是最新的,但对于指定的日期参数,它可能不是最新的。
我们还需要确保这会迅速返回(对于一小部分数据,当前查询在3-5秒左右),因为这会直接返回给用户。这意味着我们不能使用任务队列,并且因为指定的日期是任意的,所以我们不能实现对"isWithinDate“字段的大容量索引。
我们尝试使用异步查询,但由于处理量可以忽略不计,瓶颈仍然是数据存储上的查询(因为异步api仍然同步发送请求,所以不会阻塞)。
理想情况下,我们会将其实现为startDate订购的汽车行程的select,其中Car.key是不同的,但我们似乎不能在GAE中实现这一点。
我们可以做许多小的优化(例如,重复查询的一些MemCaching ),但没有一个对我们的查询时间有显著的影响。而MemCaching最多只能在1-2分钟内提供帮助(由于时间不可避免地向前推进!)
任何想法都是非常受欢迎和高度赞赏的。
谢谢你,艾德
发布于 2011-02-15 08:55:09
听起来最好的选择是自己执行许多查询。您说您尝试过异步查询,但瓶颈是发送查询。这似乎非常奇怪--你应该能够同时有许多查询,大大减少了你的延迟。您是如何确定这一点的?
发布于 2011-02-15 00:05:32
首先,我推荐使用objectify。appengine上的JDO/JPA只是欺骗了人们,让他们认为appengine数据存储只是一个SQL数据库,正如您所意识到的,这与事实相去甚远。
如果我没记错的话,你有一辆包含CarJourneys列表的车?
appengine上的列表属性限制为5000个条目,并且无论何时访问/更改它们,它们都必须全部序列化/反序列化。因此,如果你计划让每辆车都有大量的CarJourneys,那么这会变得很慢。另外,因为appengine会为集合中的每个值创建一个索引项,所以这会导致exploding indexes。
相反,只需在CarJourney中创建一个属性汽车,它指向完成旅程的汽车:从CarJourney到Car的一对一关系。类型可以是Key,也可以是包含汽车id的string/long。在查询时,只需为汽车属性添加过滤器。
我建议看一下Brett Slatkin的视频:Scalable, Complex Apps on App Engine。
发布于 2011-02-15 00:20:39
您也可以使用一个查询,自己过滤不同的汽车。比如select CarJouney startDate >= startDate and startDate <= endDate order by startData和迭代(+filter )这个查询,直到找到足够的数据来显示。
https://stackoverflow.com/questions/4993744
复制相似问题