Warum empfiehlt Cassandra, keinen Index für Spalten mit hoher Kardinalität zu erstellen?


10

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?

Antworten:


6

Bei einem Cassandra-Index ( dh einem "Sekundärindex" im Gegensatz zu Primärschlüsseln) muss jeder Knoten seine eigenen lokalen Daten abfragen, um auf eine Abfrage zu antworten (siehe FAQ zu sekundären Cassandra- Indexexexen ). Diese Indizes werden ebenfalls mithilfe eines Hintergrundprozesses erstellt . Dieser Hintergrund bedeutet, dass der Index möglicherweise falsch negative Ergebnisse in Bezug auf Treffer (oder falsch positive Ergebnisse in Bezug auf Fehlschläge) zurückgibt.

Dies bedeutet, dass in einer Spalte mit hoher Kardinalität die Änderungsrate ( dh Hinzufügungen / Löschungen) aus dieser Spalte ziemlich hoch sein kann. Wenn diese Änderungsrate schneller ist als die Aktualisierung des Index über den Hintergrundprozess, ist die Verwendung eines Index "ineffizient" (der Index führt mehr Arbeit aus, als von der Anwendung benötigt wird, was häufig zu einer falschen Antwort führt). .

Ein effizienter Ansatz in Bezug auf die Abfrage Genauigkeit könnte sein , eine zweite zu halten Tabelle , eher als ein Sekundärindex. Tabellen werden im Gegensatz zu Indizes wie jede andere Tabelle behandelt. Sie sind mehr wahrscheinlich Ihre Anwendung die Abfrageergebnisse geben ihm erwartet . Der Nachteil ist, dass das Verwalten einer Tabelle als Index im Vergleich zu einem Cassandra- "Sekundärindex" jetzt Anwendungsbeschränkungen sind ( dh Ihr Anwendungscode muss jetzt wissen, wie Zeilen aus dieser "Index" -Tabelle eingefügt / gelöscht werden können, und um die beiden Tabellen über die "Abstimmung" auf Anwendungsebene synchron zu halten).

Hoffe das hilft!


Dass Indizes mithilfe eines Hintergrundprozesses erstellt werden, ist ein bisschen… hässlich. False Positives sind für den Benutzer sichtbar, nehme ich an? (Ich sehe nicht ein, wie sie nicht wären.) Der einzige Teil, den ich noch frage, ist, wo Sie sagen: "Dies bedeutet, dass in einer Spalte mit hoher Kardinalität die Änderungsrate (dh Hinzufügungen / Löschungen) aus dieser Spalte möglich ist sei ziemlich hoch. " - Ich verstehe, warum die Änderungsrate in Bezug auf die Erstellung des BG-Index schlecht wäre, aber ich sehe immer noch nicht, was hohe Kardinalität damit zu tun hat. (Sicherlich würde sogar eine Kolonne mit niedriger Kardinalität das gleiche Schicksal erleiden, nein?)
Thanatos

Ja, eine Kolonne mit niedriger Kardinalität würde das gleiche Schicksal erleiden. Ich gebe zu, dass mein Denken dort etwas verschwommen war. Ich ging davon aus, dass ein hoher Kardinalitätsindex eher eine höhere Änderungsrate aufweisen würde (daher eher falsch positive / negative Ergebnisse aufweisen würde). Am relevantesten ist die Änderungsrate (relativ zum Hintergrundindizierungsprozess), nicht die Kardinalität.
Castaglia

2

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.