RethinkDb OrderBy 过滤前,性能

RethinkDb OrderBy Before Filter, Performance

数据 table 是我数据库中最大的 table。我想查询数据库,然后按条目时间戳对其进行排序。常识是先过滤再操作数据。

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

但这是不可能的,因为过滤器创建了一个边 table。该命令会引发错误 (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 排序的条目的最佳方法(性能方面)是什么。

编辑: 数据库 运行 有一个分片。

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

例如,可以在timestamp字段上创建一个索引:

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

可用于文档排序:

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

或者给定范围select,例如过去一小时:

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/