数据表是我的数据库中最大的表。我想查询数据库,然后按条目时间戳排序。常识是首先过滤然后操纵数据。
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使用一个分片运行。
答案 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/