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 - 优化执行地理定位、然后加入、然后分组的查询的主要内容,如果未能解决你的问题,请参考以下文章

在表单发布之前执行地理定位 javascript

RethinkDB - JavaScript加入多个项目

如果用户未回答 JavaScript 地理定位小狗,如何继续执行代码?

优化表格以搜索地理位置

如何以编程方式使用 Facebook 地理定位?

Cordova android地理定位超时