2013-06-17 6 views
6

Mit Titan w/Cassandra v 0.3.1, ich habe einen Scheitelpunkt Index über createKeyIndex wie in der Titan docs beschrieben erstellt.Titan Lookups auf indizierten Schlüssel sind unglaublich langsam?

gremlin> g.createKeyIndex("my_key", Vertex.class) 
==>null 

Ich habe jetzt appx 50k Knoten und Kanten 186K in der Grafik, und ich bin einen signifikanten Performance-Unterschied zwischen Lookups finde my_key verwenden. Diese Abfrage dauert ca. 5 Sekunden auszuführen: ID

gremlin> g.V.has("my_key", "abc") 
==>v[12345] 

während mit dem Index dauert weniger als 1 Sekunde:

gremlin> g.v(12345) 
==>v[12345] 

my_key keine eindeutige Einschränkung hat (ich will nicht), aber ich frage mich, was eine solche Leistungsdiskrepanz verursacht. Wie kann ich die Leistung bei Suchvorgängen für einen nicht eindeutigen indexierten Scheitelpunktschlüssel erhöhen?

Antwort

5

Das Problem hier ist die Verwendung von .has, die eine Filterfunktion ist und keine Indizes verwenden wird. Von GremlinDocs:

Es ist erwähnenswert, dass die Syntax von has-g.V("name", "marko") ähnlich ist, die den Unterschied des Seins ein Schlüsselindex-Lookup und als so wird schneller ausgeführt hat. Im Gegensatz dazu wird diese Zeile, g.V.has("name", "marko"), über alle Scheitelpunkte iterieren, die die Namenseigenschaft jeden Scheitelpunkt für eine Übereinstimmung prüfen, und wird erheblich langsamer als der Schlüssel Indexansatz sein.

Für das obige Beispiel, wird dies den Index verwenden, und sehr schnell die Suche durchführt (< 1 Sekunde):

gremlin> g.V("my_key", "abc") 
==>v[12345] 
+2

Dies als von Titan ist nicht korrekt 0.5.0: 'gVhas (“ my_key "," abc ")' verwendet nun einen verfügbaren Index für den 'my_key' Schlüssel. Siehe Titan [Index Dokumente] (http://s3.thinkaurelius.com/docs/titan/current/indexes.html). – AliOli