2016-03-02 29 views
1

我在orientDB建立在一个类中的以下指标:OrientDB为什么不使用正确的索引?

INDEXES (3 altogether) 
-------------------------------+----------------+ 
NAME       | PROPERTIES  | 
-------------------------------+----------------+ 
opponentId     | accountId (+) | 
           | opponentId  | 
noiseId      | noiseId  | 
protocolId     | accountId (+) | 
           | protocolId  | 

,我试图执行以下查询:

explain select * from method where accountId=1 and protocolId=1 and noiseId=1 

我怪异的结果:

1 )orient不是使用''noiseId''索引或'protocolId'索引,而是选择使用''opponentId''索引

2)下面是解释的原始输出:

{ 
    "@type": "d", 
    "@version": 0, 
    "fullySortedByIndex": false, 
    "compositeIndexUsed": 1, 
    "involvedIndexes": ["opponentId"], 
    "limit": -1, 
    "fetchingFromTargetElapsed": 0, 
    "indexIsUsedInOrderBy": false, 
    "elapsed": 0.195936, 
    "resultType": "collection", 
    "resultSize": 0, 
    "@fieldTypes": "compositeIndexUsed=l,involvedIndexes=e,fetchingFromTargetElapsed=l,elapsed=f" 
} 

3)这里的所有字段都是数字(accountId = long,其余为整数)。索引是SBTREE类型,不是唯一的

有什么我在这里做错了吗?有人可以对OrientDB的索引逻辑进行一些阐述吗?

+0

嗨,什么类型/类型的索引您使用的是? – LucaS

+0

字段类型都是数字(accountId很长,其余都是整数) 索引类型都是SBTREE而不是NOTUNIQUE – anonybunny

+0

对不起,我发布了答案,但我还没有看到您的消息。我使用了一个独特的索引,但概念应该是一样的。 – LucaS

回答

0

我想你的情况下,采用这种结构:

select from Method 

----+-----+------+---------+-------+----------+---------- 
# |@RID |@CLASS|accountId|noiseId|opponentId|protocolId 
----+-----+------+---------+-------+----------+---------- 
0 |#21:0|Method|0  |0  |0   |0 
1 |#21:1|Method|4  |4  |4   |4 
2 |#21:2|Method|8  |8  |8   |8 
3 |#22:0|Method|1  |1  |1   |1 
4 |#22:1|Method|5  |5  |5   |5 
5 |#22:2|Method|9  |9  |9   |9 
6 |#23:0|Method|2  |2  |2   |2 
7 |#23:1|Method|6  |6  |6   |6 
8 |#24:0|Method|3  |3  |3   |3 
9 |#24:1|Method|7  |7  |7   |7 
----+-----+------+---------+-------+----------+---------- 

,这些都是我的指标

NAME   | TYPE  | FIELDS       
-------------|-------------|---------------------------- 
opponentId | UNIQUE | ["accountId","opponentId"] 
noiseId  | UNIQUE | ["noiseId"]     
protocolId | UNIQUE | ["accountId","protocolId"] 

如果我执行查询

explain select * from method where accountId=1 and protocolId=1 and noiseId=1 

用途不同仅opponentId显示为

{ 
"result": [ 
    { 
     "@type": "d", 
     "@version": 0, 
     "documentReads": 1, 
     "fullySortedByIndex": false, 
     "compositeIndexUsed": 1, 
     "current": "#22:0", 
     "documentAnalyzedCompatibleClass": 1, 
     "recordReads": 1, 
     "involvedIndexes": [ 
      "opponentId" 
     ], 
     "limit": -1, 
     "fetchingFromTargetElapsed": 0, 
     "indexIsUsedInOrderBy": false, 
     "evaluated": 1, 
     "elapsed": 1.696754, 
     "resultType": "collection", 
     "resultSize": 1, 
     "@fieldTypes": "documentReads=l,compositeIndexUsed=l,current=x,documentAnalyzedCompatibleClass=l,recordReads=l,involvedIndexes=e,fetchingFromTargetElapsed=l,evaluated=l,elapsed=f" 
    } 
], 
"notification": "Query executed in 0.047 sec. Returned 1 record(s)" 

}

在这篇文章中https://groups.google.com/forum/#!topic/orient-database/f7bd3s4f3Jo似乎在多个AND条件下使用的OrientDB查询执行无法管理多个索引,但您可以使用LET语句在查询中正确使用索引。

查询

select expand(intersect($a,$b,$c)) 
let $a = (select from Method where accountId=1), 
    $b = (select from Method where protocolId=1), 
    $c = (select from Method where noiseId=1) 

输出

----+-----+------+---------+-------+----------+---------- 
# |@RID |@CLASS|accountId|noiseId|opponentId|protocolId 
----+-----+------+---------+-------+----------+---------- 
0 |#22:0|Method|1  |1  |1   |1 
----+-----+------+---------+-------+----------+---------- 

希望它可以帮助

+0

嗨anonybunny,你有机会尝试查询? – LucaS