【问题标题】:RethinkDb OrderBy Before Filter, PerformanceRethinkDb OrderBy 过滤前,性能
【发布时间】:2017-01-19 17:10:29
【问题描述】:

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

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 使用一个分片运行。

【问题讨论】:

    标签: rethinkdb rethinkdb-javascript


    【解决方案1】:

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

    例如,可以在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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多