Cassandra: Auswahl eines Partitionsschlüssels
Ich bin unschlüssig, ob es besser ist, performance-Weise, ist eine sehr gängige Spalte Wert (wie Country
) als partitionsschlüssel für eine zusammengesetzte primary key-oder einen ziemlich einzigartigen Spalte Wert (wie Last_Name
).
Blick auf Cassandra 1.2 Dokumentation über Indizes ich dieses:
"Wenn Sie einen index verwenden:
Cassandra ' s built-in-Indizes sind am besten auf einem Tisch
viele Zeilen, die den indizierten Wert. Mehr einzigartige
Werte, die es in einer bestimmten Spalte, die mehr Aufwand Sie
haben, im Durchschnitt, Abfragen und verwalten des index. Zum Beispiel,
angenommen, Sie hätten eine user-Tabelle mit einer Milliarde Nutzer und wollte mal schauen
Benutzer, die durch den Staat in der Sie lebten. Viele user teilen sich die gleiche
Spalte Wert für den Status (wie z.B. CA, NY, TX, etc). Dies wäre ein
guter Kandidat für einen index.""Nicht zu verwenden wenn ein index:
Nicht einen index verwenden, um der Abfrage eine große Menge an Datensätzen für einen kleinen
Anzahl der Ergebnisse. Zum Beispiel, wenn Sie erstellen einen index für eine Spalte
das hat viele verschiedene Werte, eine Abfrage zwischen den Feldern entstehen
viele sucht für sehr wenige Ergebnisse. In der Tabelle mit einer Milliarde Nutzer,
suchen Benutzer anhand Ihrer E-Mail-Adresse (ein Wert, der in der Regel
für jeden Benutzer eindeutig ist), anstatt von Ihrem Zustand, ist sehr wahrscheinlich
ineffizient ist. Es wäre wahrscheinlich effizienter, die manuell pflegen
die Tabelle wird als form eines index anstelle der Verwendung der Cassandra
built-in-index. Für Spalten mit eindeutigen Daten, ist es manchmal
feine Leistung-klug, um einen index für die Bequemlichkeit, solange der
Abfrage der Lautstärke, um die Tabelle mit einer indizierten Spalte ist Moderat und nicht
unter der ständigen Last."
Blick auf die Beispiele von CQL SELECT für
"Abfragen zusammengesetzte Primärschlüssel und Sortieren von Ergebnissen", ich sehe etwas wie eine UUID verwendet wird als partition key... was darauf hindeuten würde, dass es besser, etwas ziemlich einzigartiges?
InformationsquelleAutor der Frage andandandand | 2013-08-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Indizierung in der Dokumentation, die Sie schrieb, bezieht sich auf die sekundären Indizes. Kassandra es ist ein Unterschied zwischen der primären und der sekundären Indizes. Für einen sekundären index es wäre in der Tat schlecht, sehr eindeutige Werte, jedoch für die Komponenten, die in einer primary key-dies hängt davon ab, welche Komponenten wir setzen auf. In der Primärschlüssel-haben wir diese Komponenten:
Den partitionierungsschlüssel wird zum verteilen von Daten über verschiedene Knoten, und wenn Sie möchten, dass Ihre Knoten ausgeglichen sein (d.h. gut verteilten Daten in jedem Knoten), dann willst du deine Partitionierung Schlüssel, so zufällig wie möglich. Deshalb ist das Beispiel haben Sie verwendet UUIDs.
Den clustering-Schlüssel, der verwendet wird für die Bestellung so, dass die Abfrage von Spalten, die mit einer bestimmten clustering-Schlüssel, kann es effizienter sein. Das ist, wo Sie möchten, dass Ihre Werte nicht eindeutig sein, und wo es einen Leistungseinbruch, wenn eindeutige Zeilen waren Häufig.
Den cql-docs haben eine gute Erklärung, was Los ist.
InformationsquelleAutor der Antwort Lyuben Todorov
wenn Sie cql3, da eine Spalte-Familie:
durch die Definition eines
primary key (a1, a2, ...), b1, b2, ... )
Dies impliziert, dass:
a1, a2, ...) sind Felder, die verwendet werden, um Handwerk eine Zeile Schlüssel, um:
b1, b2, ... sind in der Spalte Familie Felder verwendet, um cluster eine Zeile Schlüssel, um:
Alle übrigen Felder sind effektiv Multiplex /dupliziert, für jede mögliche Kombination von Spalten-Schlüssel. Hier unten ein Beispiel über zusammengesetzte Schlüssel mit partition Tasten und clustering Schlüssel arbeiten.
Wenn Sie verwenden möchten, Bereichsabfragen, die Sie verwenden können, Sekundär-Indizes oder (ab cql3) Sie können erklären, diese Felder als clustering-Schlüssel. In Bezug auf die Geschwindigkeit, mit Ihnen als clustering-Schlüssel wird eine einzelne Reihe. Dies hat Auswirkungen auf die Geschwindigkeit, da Sie Holen mehrere clustering-Schlüssel-Werte wie:
select * from accounts where Country>'Italy' and Country<'Spain'
InformationsquelleAutor der Antwort natbusa
Ich bin sicher, Sie würde eine Antwort bekommen, aber noch kann dies helfen, Sie besser zu verstehen.
hier die partition Tasten (a1, a2) und Zeile Tasten b1,b2.
Kombination der beiden partition Schlüssel und die Zeilen-Schlüssel muss eindeutig sein für jeden neuen Datensatz Eintrag.
den oben genannten Primärschlüssel kann definieren, wie diese.
wie wir wissen Partition Key ist verantwortlich für die Verteilung der Daten auf Knoten.
Also, wenn Sie das einfügen 100 Datensätze in table1 mit dem gleichen partition Tasten und verschiedenen row-keys. es speichert Daten in der gleichen Knoten, aber in unterschiedlichen Spalten.
logisch können wir darstellen, wie diese.
Damit der Datensatz gespeichert werden sequenziell im Speicher.
InformationsquelleAutor der Antwort Aftab