2016-11-30 50 views
0

我是新來的rethinkdb,我喜歡它,但我發現一些問題,當我試圖優化我的查詢,並使其在更大的數據集上工作。 問題很簡單。我需要通過timestamp(row.to),tag(row.tags),timestamp(row.from)排序,然後爲分頁切片來過濾我的「事件」表。Rethinkdb getAll,orderBy與索引 - 標籤

row.tags有一個多索引,效果很好!

row.from和row.to是Event的開始/結束時間。

慢速查詢(testeded在100K的條目)是這樣的:

r.db("test").table("event") 
.getAll(r.args(["148a6e03-b6c3-4092-afa0-3b6d1a4555cd","7008d4b0-d859-49f3-b9e0-2e121f000ddf"]), {"index": "tags"}) 
.filter(function(row) {return row("to").ge(r.epochTime(1480460400));}) 
.orderBy(r.asc("from")) 
.slice(0,20) 

我 '從' 上創建一個索引,並做

.orderBy(r.asc("from"),{index:'from'}) 

,但我得到

e:索引order_by只能在TABLE或TABLE_SLICE中執行:

我已經閱讀了有關Rethinkdb中索引交集的問題,但也許我錯過了一些東西,也許有一種方法可以完成這個簡單的任務。

謝謝。

回答

0

RethinkDB抱怨的原因是這樣的: getAll返回一個selection。當filter應用於selection時,它將返回selection。當orderBy應用於selection時,不能使用index參數(僅當orderBy應用於table時,才能使用該參數)。

orderBy可應用於tablesequenceselection只有適用於table可以使用index參數。這是有道理的,因爲索引在從表中添加和刪除行時更新。

對您而言,您應用orderByfilter這是一個selection的結果。爲了進行排序選擇數據庫需要:

  1. 讀取所有元素到內存中(默認情況下最多爲100,000元)
  2. 排序他們利用所提供的功能或現場

,它可以在這種情況下不使用索引。

改善查詢的方法可能是先對錶格排序,然後應用過濾器。在這種情況下,您將能夠使用索引。

+0

對不起,以便延遲迴復。我已經做到了,但是如果我對索引進行排序,比我無法再使用getAll! – xtian