簡體   English   中英

ArangoDB通過_id獲取文檔,每個查詢具有緩存

[英]ArangoDB get document by _id with cache per query

具有文檔集合“ items”和“ dictionary1”,“ dictionary2”

collection "items" have 50000 records, like
{
label:"..."
dict1: "dictionary1/33333"
dict2: "dictionary2/44444"
....
}

當我加入字典

FOR item IN items
LET dictname = FIRST(FOR d IN dictionary1 FILTER d._id == item.dict1 RETURN d.name)
RETURN { _id: item._id, name: item.name, dict: dictname }

對於這個簡單的任務,查詢執行時間約為150毫秒。 對於實驗,我是一個_id的強制字典

FOR item IN items
LET dictname = FIRST(FOR d IN dictionary1 FILTER d._id == "dictionary1/10000" RETURN d.name)
RETURN { _id: item._id, name: item.name, dict: dictname }

查詢執行時間〜130ms

我也嘗試過DOCUMENT功能

FOR item IN items
LET dictname = DOCUMENT("dictionary1", "dictionary1/10000")
RETURN { _id: item._id, name: item.name, dict: dictname.name }

查詢執行時間〜1500ms:((

從集合中簡單讀取:

FOR item IN items
RETURN { _id: item._id, name: item.name }

查詢執行時間〜30ms

因此,當我通過_id 50000次獲得相同文檔作為連接時,結果不會被緩存。 在一個館藏中重復內容的變體對我沒用。 現在,我將邏輯移到客戶端,選擇內存中的所有字典並在查詢后加入,大約有60ms,但是我不喜歡這種方法,這是錯誤的。

有什么辦法可以在短時間內獲得帶有連接字典(80%相同的_id)的結果嗎?

如果您確定在dictionary1對於在外部循環中循環的每個items都有匹配的項目,則可以將查詢簡化為一個更簡單的等聯接,如下所示:

FOR item IN items
  FOR d IN dictionary1 
    FILTER d._id == item.dict1
    RETURN { _id: item._id, name: item.name, dict: d.name }

這消除了對相關子查詢和函數調用的需要。 但是,如果每個item都有匹配的dictionary條目,則其結果將僅與原始子查詢解決方案等效。 如果沒有dictionary一個條目item ,在同等聯接查詢只會壓制它。

如果不清楚在dictionary1是否會有一個條目,並且您希望為不匹配返回null ,則可以將子查詢解決方案簡化為(這消除了對FIRST的函數調用):

FOR item IN items
  LET sub = (FOR d IN dictionary1 
    FILTER d._id == item.dict1
    RETURN d.name
  )
  RETURN { _id: item._id, name: item.name, dict: sub[0] }

除此之外,由於_key_id短且生成復雜,因此使用_key屬性而不是使用_id可以提供較小的加速。 但是,這將需要存儲的連接值items不字典集合名稱前綴。

上面的建議不應該提供數量級的運行時改進,但也許有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM