[英]Array index on ArangoDb
我在 ArangoDb 中的集合具有具有此架構的對象(簡化):
{
"userName": "Billy",
"email": "Billy@test.com",
"logins": [
{
"authenticationTokens": [],
"loginProvider": "Facebook",
"providerKey": "123",
"providerDisplayName": null
}
],
"roles": [],
"claims": []
}
這是 BorderEast aspnetcore-identity-arangodb在 ArangoDb 上的 ASPNetCore.Identity 實現
問題:
要使用 Facebook 進行身份驗證,它使用 AQL 查詢
for u in IdentityUser for l in u.logins filter l.loginProvider == "Facebook" && l.providerKey == "123" return u
運行良好但不使用任何索引
Indexes used:
none
我試過指數:
db.IdentityUser.ensureIndex({ type: "hash", fields: [ "logins[*].loginProvider", "logins[*].providerKey" ] });
db.IdentityUser.ensureIndex({ type: "hash", fields: [ "logins[*].loginProvider" ] });
db.IdentityUser.ensureIndex({ type: "hash", fields: [ "logins[*].providerKey" ], unique: true });
它們都沒有被使用。
有人可以建議該查詢的索引應該是什么樣子嗎?
問題在於他們的查詢。 它需要重新編寫,然后才能工作。 它與使用in
比較運算符有關,如本答案中所述:
“2.8 中的查詢仍然不會使用該索引,因為數組索引僅用於 IN 比較運算符。”
因此,如果我們更改查詢,我們會得到:
Query string:
for u in IdentityUser
let l = u.logins[*].loginProvider
let p = u.logins[*].providerKey
filter "google" in l and "googlekey" in p
return u
Execution plan:
Id NodeType Est. Comment
1 SingletonNode 1 * ROOT
8 IndexNode 1 - FOR u IN IdentityUser /* persistent index scan */
9 CalculationNode 1 - LET #7 = ("googlekey" in u.`logins`[*].`providerKey`) /* simple expression */ /* collections used: u : IdentityUser */
6 FilterNode 1 - FILTER #7
7 ReturnNode 1 - RETURN u
Indexes used:
By Type Collection Unique Sparse Selectivity Fields Ranges
8 persistent IdentityUser false false n/a [ `logins[*].loginProvider` ] ("google" in u.`logins`[*].`loginProvider`)
Optimization rules applied:
Id RuleName
1 move-calculations-up
2 remove-unnecessary-calculations
3 use-indexes
4 remove-filter-covered-by-index
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.