【问题标题】:N1QL Query ARRAY_CONTAINS speedN1QL 查询 ARRAY_CONTAINS 速度
【发布时间】:2016-11-16 23:30:02
【问题描述】:

我有以下形式的文件需要查询:

{
  "id": "-KWiJ1LlYbXSSRUmocwK",
  "ownerID": "72f16d9d-b905-498c-a7ff-9702cdcae996",
  "orgID": "20071513",
  "teams": [
    "5818f7a75f84c800079186a8",
    "5818cbb25f84c800079186a7"
  ]
}

我希望能够根据 ownerID 和 teams 数组进行查询。我的查询目前看起来像这样:

SELECT id FROM
default AS p 
WHERE p.ownerID = $1
OR ARRAY_CONTAINS(p.teams, $2)
ORDER BY id

因此,我可以获取具有预期 ownerID 的文档以及在 teams 数组中具有特定团队 ID 的文档。此查询确实有效,但是当我有很多文档时我担心性能,并且可能某些文档分配了多达 20 个团队。

我走对了吗?

编辑:Couchbase 4.1 版

【问题讨论】:

    标签: couchbase n1ql


    【解决方案1】:

    Couchbase 4.5 引入了数组索引。这使您可以索引数组的各个元素,在您的情况下是团队数组。这对于查询的性能至关重要。使用 4.5.1 或 4.6,您将:

    CREATE INDEX idx_owner ON default( ownerID );
    CREATE INDEX idx_teams ON default( DISTINCT ARRAY t FOR t IN teams END );
    
    SELECT id
    FROM default AS p
    WHERE p.ownerID = $1
    UNION
    SELECT id
    FROM default AS p
    WHERE ANY t IN p.teams SATISFIES t = $2 END;
    

    【讨论】:

    • 是的,我现在正在使用社区,所以我相信我暂时停留在 4.1,但我肯定会尽可能升级。
    • 另外,在使用 WHERE ANY 与 ARRAY_CONTAINS(至少在 4.1 中)进行了一些测试之后,ARRAY_CONTAINS 似乎在速度上略胜一筹。
    • 我发现了一个问题:您必须为 CREATE INDEX 和 SELECT 使用相同的变量名(在本例中为 t)。如果它们不匹配,查询可能会工作,但速度会慢得多,因为查询规划器不会使用索引(即使给定了 USE INDEX)。
    猜你喜欢
    • 1970-01-01
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    相关资源
    最近更新 更多