【问题标题】:ArangoDB get document by _id with cache per queryArangoDB 通过 _id 获取文档,每个查询都有缓存
【发布时间】:2015-10-14 21:24:53
【问题描述】:

拥有文档集合“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 次获得相同的文档作为连接时,结果没有被缓存。 一个集合中有重复内容的变体对我没有用。 现在我将逻辑移动到客户端,选择内存中的所有字典并在查询后加入,大约有 60 毫秒,但我不喜欢这种方法,它错了。

有什么方法可以在短时间内获得加入字典的结果(80% 相同的_id)?

【问题讨论】:

  • 答案是否满足您的需求?如果没有,缺少什么?如果,你能把它标记为接受吗?

标签: database performance arangodb aql


【解决方案1】:

如果您确定在外循环中循环的每个 itemsdictionary1 中都有一个匹配项,则可以将查询简化为更简单的等值连接,如下所示:

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 条目,其结果将仅等同于原始子查询解决方案。如果item 没有dictionary 条目,则等连接查询将简单地抑制它。

如果不清楚dictionary1 中是否会有条目,并且您希望nulls 因不匹配而返回,则子查询解决方案可以简化为(这将删除对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 中。

上述建议不应提供数量级的运行时改进,但也许它们会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 2015-11-08
    • 1970-01-01
    相关资源
    最近更新 更多