In der Cassandra-Dokumentation heißt es:
Verwenden Sie in folgenden Situationen keinen Index:
- In Spalten mit hoher Kardinalität, weil Sie dann ein großes Datensatzvolumen nach einer kleinen Anzahl von Ergebnissen abfragen. Siehe Probleme bei der Verwendung eines Spaltenindex mit hoher Kardinalität weiter unten.
Es geht weiter,
Wenn Sie einen Index für eine Spalte mit hoher Kardinalität erstellen, die viele unterschiedliche Werte aufweist, führt eine Abfrage zwischen den Feldern zu vielen Suchanfragen nach sehr wenigen Ergebnissen. In der Tabelle mit einer Milliarde Songs ist es wahrscheinlich sehr ineffizient, Songs nach Autoren (ein Wert, der normalerweise für jeden Song einzigartig ist) anstatt nach Künstlern zu suchen. Es wäre wahrscheinlich effizienter, die Tabelle manuell als eine Form eines Index zu verwalten, anstatt den integrierten Cassandra-Index zu verwenden. Bei Spalten mit eindeutigen Daten ist es manchmal in Bezug auf die Leistung in Ordnung, der Einfachheit halber einen Index zu verwenden, solange das Abfragevolumen für die Tabelle mit einer indizierten Spalte moderat ist und nicht ständig geladen wird.
Aber beantwortet nie wirklich die Frage: Warum ist es ineffizient? Ich habe keine Ahnung, was "manuelles Verwalten der Tabelle als Form eines Index" bedeutet. Aber dann widerspricht es sich etwas mit "... es ist manchmal in Bezug auf die Leistung in Ordnung, einen Index der Einfachheit halber zu verwenden, solange das Abfragevolumen moderat ist ..."
Versucht das nur, mir zu sagen, dass ich die PK verwenden soll, wann und wo ich kann? Was ist die Ineffizienz? Mein Verständnis ist, dass eine Abfrage, die einen Index treffen würde, jeden Knoten im Cluster abfragen müsste, und dann würde jeder Knoten eine Suche in seinem lokalen Index durchführen und die Ergebnisse würden dann aggregiert. Dies ist nicht unbedingt teuer (jede Indexsuche sollte ziemlich billig sein), außer dass wir die Netzwerklatenz bezahlen, da wir auf den langsamsten Knoten des Loses warten müssen. Vermisse ich hier etwas?
Aber wenn ich eine Sammlung habe, die Bajillion Gegenstände enthält, die - in seltenen Fällen - durch ein anderes, aber fast einzigartiges Attribut nachgeschlagen werden müssen ... ist dies eine angemessene Verwendung, oder?
¹Jedes? IDK, wenn Replikation bedeutet, dass dies 1/3 des Clusters für einen Replikationsfaktor von 3 treffen kann oder nicht?
Einige Begriffe: Übergeordnete Tabelle ist die Tabelle, für die ein Index erstellt wird. Sekundäre Indextabelle ist die Tabelle, die erstellt wird, um einen Index für eine andere Tabelle zu verwalten.
Die Daten der sekundären Indextabelle werden auf demselben Knoten wie die Daten der übergeordneten Tabelle gespeichert. Der Cassandra-Partitionierer partitioniert und verteilt die Indextabellendaten nicht. Wenn Sie also eine Indexspalte suchen möchten, werden alle Knoten abgefragt, nicht nur die Replikatknoten, die die Daten enthalten. (Der Koordinatorknoten weiß nicht, wo sich die Daten befinden.) https://www.datastax.com/dev/blog/cassandra-native-secondary-index-deep-dive
Für Spalten mit hoher Kardinalität wie ssn oder eine andere eindeutige ID gibt es eine Eins-zu-Eins-Zuordnung mit dem Primärschlüssel. Wenn Sie einen Index für eine solche Spalte erstellen, befinden sich die Daten in der Anzahl der Knoten des Replikationsfaktors, der Suchaufruf wird jedoch auf allen Knoten ausgeführt. Im besten Fall trifft der Koordinator direkt auf die Knoten, die Daten enthalten, und sobald die Konsistenzstufe erreicht ist, erhalten Sie Ihr Ergebnis. Im schlimmsten Fall, wenn die gesuchten Daten nicht im Index vorhanden sind, warten Sie, bis alle Knoten antworten, um festzustellen, dass die Daten nicht vorhanden sind. Bei jedem Suchaufruf in einer sekundären Indextabelle werden alle Knoten getroffen. Vergleichen Sie dies mit nur der Replikationsfaktoranzahl der Knoten, die bei jedem Suchaufruf getroffen werden, falls die Tabelle eine normale C * -Tabelle ist.
quelle