2

OrientDB v2.1.1、私は2つのクラスを持っています:NOrderとNPassenger、関係1:n、NOrderには「passengers」という名前のフィールドがあり、そのタイプはlinklistです。

私は2つのフィールド(NOrder order_id、NPassenger.Name)を持っていますインデックスが確立されています

NOrder ducuments カウントは 300 万です。

これらのクエリについて説明します。

 1)select from NOrder where passengers contains(name = 'xxx')
  why this query not involved index .

 2)select from NOrder where 'xxx' in passengers.name
  this query involved indexeses 

このクエリのコストは 120 秒です。

ありがとう

4

1 に答える 1

0

私はこの構造で試しました

create class NPassenger
create property NPassenger.name String
create index NPassenger.name on NPassenger (name) NOTUNIQUE_HASH_INDEX

create class NOrder 
create property NOrder.order_id String
create property NOrder.passengers linklist NPassenger
create index NOrder.order_id on NOrder (order_id) UNIQUE_HASH_INDEX

insert into NPassenger(name) values ("xxx")  // 12:0
insert into NPassenger(name) values ("Alessandro")  //12:1

insert into NOrder(order_id,passengers) values ("order 1",[12:0])
insert into NOrder(order_id,passengers) values ("order 2",[12:1])

クエリ 1

explain select from NOrder where passengers contains(name = 'xxx')

ここに画像の説明を入力

クエリ 2

explain select from NOrder where 'xxx' in passengers.name

ここに画像の説明を入力

クラス ターゲットが NOrder であるため、2 つのクエリのいずれもインデックスを使用しません。

アップデート

現在、50002 NOrder と 50002 NPassenger があります。クエリを実行すると

explain select from NOrder where passengers contains(name = 'xxx')

explain select from NOrder where 'xxx' IN passengers.name'

私は得る

ここに画像の説明を入力

これは、name フィールドのインデックスが使用されておらず (ターゲット クラスが Norder クラスであるため)、クラス Norder の 50002 レコードすべてに対して検索が行われるためです。

クエリを使用する場合

explain select from NPassenger where name = "xxx"

ここに画像の説明を入力

ターゲット クラスが NPassenger であるため、インデックス NPassenger.name が使用されます。

于 2016-03-08T16:38:08.077 に答える