RethinkDb OrderBy Before Filter,Performance

时间:2017-01-19 17:10:30

标签: rethinkdb rethinkdb-javascript

数据表是我的数据库中最大的表。我想查询数据库,然后按条目时间戳排序。常识是首先过滤然后操纵数据。

queryA = r.table('data').filter(filter).filter(r.row('timestamp').minutes().lt(5)).orderBy('timestamp')

但这是不可能的,因为过滤器会创建一个边桌。该命令会抛出错误(https://github.com/rethinkdb/rethinkdb/issues/4656)。

所以我想知道我是否先将orderBy放在第一位,如果这会在数据库随时间变得巨大的情况下导致性能下降。

queryB = r.table('data').orderBy('timestamp').filter(filter).filter(r.row('timestamp').minutes().lt(5))

目前我在查询后订购它,但通常数据库在这些过程中更快。

queryA.run (err, entries)->
  ...
  entries = _.sortBy(entries, 'timestamp').reverse() #this process takes on my local machine ~2000ms

问题:

查询由timestamp排序的条目的最佳方法(性能明智)。

编辑: db使用一个分片运行。

1 个答案:

答案 0 :(得分:2)

使用索引通常是提高性能的最佳方法。

例如,可以创建timestamp字段的索引:

r.table('data').indexCreate('timestamp')

它可用于对文档进行排序:

r.table('data').orderBy({index: 'timestamp'})

或选择给定范围,例如过去一小时:

r.table('data').between(r.now().sub(60*60), r.now(), {index: 'timestamp'})

最后两个操作可以合并为一个:

r.table('data').between(r.now().sub(60*60), r.maxval, {index: 'timestamp'}).orderBy({index: 'timestamp'})

还可以添加其他过滤器。在索引操作之后应始终放置filter

r.table('data').orderBy({index: 'timestamp'}).filter({colour: 'red'})

对过滤器的此限制仅适用于索引操作。常规orderBy可以放在过滤器之后:

r.table('data').filter({colour: 'red'}).orderBy('timestamp')

有关详细信息,请参阅RethinkDB文档:https://www.rethinkdb.com/docs/secondary-indexes/python/