我显然遗漏了一些东西,当我运行以下查询时,我得到了一个40ms的响应:
FOR t IN tt
FOR a in aa
FILTER a.from._key == t._key
AND a.value == @v
LIMIT 20 RETURN t但是当我添加一个排序时,查询就会一直运行,直到我不得不终止它!
FOR t IN tt
FOR a in aa
FILTER a.from._key == t._key
AND a.value == @v
SORT t.identifier.value ASC
LIMIT 20 RETURN t我在identifier.value上有一个skiplist索引,但当我查看执行计划时,我看到了一个可怕的全集合扫描。
2 EnumerateCollectionNode 240126 - FOR t IN tt /* full collection scan */ 我有250000个tt格式的文档,比如:
{
“_key”: "CA0350ED-4929-3D1A-37A5-8AB951CE3AB5"
"type": “f.g.h”,
"identifier": {
“dist”: “N”,
"value": "Matt100145 ZZZ"
}
}和500000个aa格式的文档,例如:
{
“_key”: "1BBDE335-B118-3ED5-DE3B-77D822822210"
"type": “a.b.c”,
"from": {
"_key": "CA0350ED-4929-3D1A-37A5-8AB951CE3AB5",
"value": "Matt100145 ZZZ”
}
},
"value": “ZZZ”
}tt中的所有ZZZ值都是MattNUMBER identifier.value (测试数据),所以这可能是导致问题的原因?
不带排序的查询计划如下所示:
Execution plan:
Id NodeType Est. Comment
1 SingletonNode 1 * ROOT
9 IndexNode 2 - FOR a IN aa /* hash index scan */
8 IndexNode 2 - FOR t IN tt /* primary index scan */
6 LimitNode 2 - LIMIT 0, 20
7 ReturnNode 2 - RETURN t
Indexes used:
By Type Collection Unique Sparse Selectivity Fields Ranges
9 hash aa false false 50.00 % [ `value` ] (a.`value` == "Matt123")
8 primary tt true false 100.00 % [ `_key` ] (a.`from`.`_key` == t.`_key`)排序看起来像这样:
Execution plan:
Id NodeType Est. Comment
1 SingletonNode 1 * ROOT
2 EnumerateCollectionNode 85706 - FOR t IN tt /* full collection scan */
6 CalculationNode 85706 - LET #4 = t.`identifier`.`value` /* attribute expression */ /* collections used: t : tt */
10 IndexNode 85706 - FOR a IN aa /* hash index scan */
11 CalculationNode 85706 - LET #2 = (a.`value` == "Matt123") /* simple expression */ /* collections used: a : aa */
5 FilterNode 85706 - FILTER #2
7 SortNode 85706 - SORT #4 ASC
8 LimitNode 20 - LIMIT 0, 20
9 ReturnNode 20 - RETURN t
Indexes used:
By Type Collection Unique Sparse Selectivity Fields Ranges
10 hash aa false false 50.00 % [ `from._key` ] (a.`from`.`_key` == t.`_key`)有人能帮上忙吗?
发布于 2018-07-23 14:34:09
在您的例子中,不清楚这两个集合上到底有哪些索引。虽然只提到了一个索引,但要想正常运行,使用两个索引会更好。下面是我使用的设置:
db.tt.ensureIndex({ type: "skiplist", fields: ["identifier.value"] });
db.aa.ensureIndex({ type: "skiplist", fields: ["value"] });有了这个设置和一些样本数据,我使用ArangoDB 3.3.12得到的执行计划是:
查询字符串: FOR t in tt FOR a IN aa FILTER a.from._key == t._key a.from._key a.value == @v LIMIT 20 RETURN t
Execution plan:
Id NodeType Est. Comment
1 SingletonNode 1 * ROOT
9 IndexNode 25000 - FOR a IN aa /* skiplist index scan */
8 IndexNode 25000 - FOR t IN tt /* primary index scan */
6 LimitNode 20 - LIMIT 0, 20
7 ReturnNode 20 - RETURN t
Indexes used:
By Type Collection Unique Sparse Selectivity Fields Ranges
9 skiplist aa false false n/a [ `value` ] (a.`value` == 123)
8 primary tt true false 100.00 % [ `_key` ] (a.`from`.`_key` == t.`_key`)这似乎是一个很好的执行计划。你能检查一下这些索引对你的情况是否也有帮助吗?
(注意:下次请发布您创建的所有索引以及完整的执行计划,而不仅仅是片段-这样您可能会获得更精确的帮助)
https://stackoverflow.com/questions/51461001
复制相似问题