![](/img/trans.png)
[英]Arangodb, simply get back the id after running an insert query in php?
[英]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.