RethinkDB - 优化执行地理定位、然后加入、然后分组的查询
Posted
技术标签:
【中文标题】RethinkDB - 优化执行地理定位、然后加入、然后分组的查询【英文标题】:RethinkDB - optimize query that does geolocation, then join, then grouping 【发布时间】:2015-05-05 04:16:47 【问题描述】:在我的应用程序中,我有两个表:一个用于用户(带有地理空间索引“位置”),另一个用于用户收到的分数(“用户 ID”上的二级索引)。
我正在尝试设计一个查询,以获取最接近特定地理位置的 25 位用户的最新分数。见下文:
// "location" is a variable that holds r.point(lon, lat)
r
.table('users')
.getNearest(location, index: 'location', maxDist: 500)
.limit(25)
.eqJoin(
r.row('doc')('id'), // the getNearest returns original data inside "doc" object
r.table('scores'),
index: 'userid')
.zip()
.group('userid')
.max('scoredate')
现在,我在 users 表中有大约 40k 用户,在 score 表中有大约 100k 分数。此操作的平均查询时间为 50ms-100ms,我正在尽可能地改进它。
谁能帮我优化这个查询?我想让它尽可能快,因为用户/分数表在不断增长。
【问题讨论】:
一个小的优化是通过将maxResults: 25
optarg 添加到getNearest
来替换limit(25)
:.getNearest(location, index: 'location', maxDist: 500, maxResults: 25)
【参考方案1】:
这看起来是我能想到的最快版本的查询。如果 50-100 毫秒太高,您可能只需要更快的硬件。如果现在速度还可以,但您担心以后会变慢,我不会太担心,因为这两个操作都已编入索引,因此它应该可以很好地扩展。
【讨论】:
以上是关于RethinkDB - 优化执行地理定位、然后加入、然后分组的查询的主要内容,如果未能解决你的问题,请参考以下文章