Różnica między kluczem partycji, kluczem złożonym a kluczem do klastrowania w Cassandrze?
523
Czytałem artykuły w Internecie, aby zrozumieć różnice między następującymi keytypami. Ale trudno mi to pojąć. Przykłady z pewnością pomogą lepiej zrozumieć.
W sytuacji klucza podstawowego KOMPOZYTOWEGO „pierwsza część” klucza nazywa się KLUCZEM PARTYCJI (w tym przykładzie klucz_part_one to klucz partycji), a drugą częścią klucza jest KLUCZ klastrowy (w tym przykładzie key_part_two )
Należy pamiętać, że zarówno partycja, jak i klucz klastrowania mogą być tworzone przez więcej kolumn , oto jak:
insert into stackoverflow_simple (key, data) VALUES ('han', 'solo');
select * from stackoverflow_simple where key='han';
zawartość tabeli
key | data
----+------
han | solo
KLUCZ KOMPOZYTOWY / ZWIĄZANY może wyszukiwać „szerokie wiersze” (tzn. Można wyszukiwać tylko za pomocą klucza partycji, nawet jeśli zdefiniowano klucze klastrowania)
insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 9, 'football player');
insert into stackoverflow_composite (key_part_one, key_part_two, data) VALUES ('ronaldo', 10, 'ex-football player');
select * from stackoverflow_composite where key_part_one = 'ronaldo';
zawartość tabeli
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo | 9 | football player
ronaldo | 10 | ex-football player
Ale możesz wykonać zapytanie za pomocą całego klucza (zarówno partycji, jak i klastrowania) ...
select * from stackoverflow_composite
where key_part_one = 'ronaldo' and key_part_two = 10;
wynik zapytania
key_part_one | key_part_two | data
--------------+--------------+--------------------
ronaldo | 10 | ex-football player
Ważna uwaga: klucz partycji jest minimalnym specyfikatorem potrzebnym do wykonania zapytania za pomocą where clause. Jeśli masz złożony klucz partycji, taki jak poniżej
na przykład: PRIMARY KEY((col1, col2), col10, col4))
Możesz wykonać zapytanie tylko przekazując co najmniej zarówno col1, jak i col2, są to 2 kolumny, które definiują klucz partycji. Zgodnie z ogólną zasadą zapytania należy przekazać co najmniej wszystkie kolumny kluczy partycji, a następnie można opcjonalnie dodać każdy klucz klastrowania w kolejności, w jakiej są ustawione.
więc prawidłowe zapytania to (z wyłączeniem indeksów wtórnych )
Jak napisałem - << „Ogólną” zasadą do zapytania jest to, że musisz przekazać przynajmniej wszystkie kolumny kluczy partycji, a następnie możesz dodać każdy klucz w kolejności, w jakiej są ustawione. >> - ponieważ col10 jest wcześniej zdefiniowany col4 musisz przekazać go do zapytania również o col4
Carlo Bertuccini,
2
Możesz dodać indeksy wtórne, ale to nie znaczy, że możesz wykonać „dowolne” zapytanie cql - i więcej: przed utworzeniem indeksu wtórnego powinieneś policzyć do 10 ... 000 ..... :)
Carlo Bertuccini
2
Indeksy wtórne są implementowane jako indeksy lokalne - nie są dystrybuowane w klastrze. Każdy węzeł klastra jest odpowiedzialny za przechowywanie wtórnych indeksów danych, które posiada. Z tego powodu zapytanie dotyczące sec.index może obejmować wszystkie węzły w klastrze
Carlo Bertuccini,
5
Przez kilka dni to mnie myliło, dzięki za tę odpowiedź, teraz jestem w stanie zbudować model danych w mojej głowie.
Roger Dwan
2
łał. właśnie uratowałeś mnie godziny lub dni! Dziękuję, wspaniałe wyjaśnienie.
Andre Garcia,
128
Dodanie odpowiedzi podsumowującej jako zaakceptowanej jest dość długie. Terminy „wiersz” i „kolumna” są używane w kontekście CQL, a nie w jaki sposób Cassandra jest faktycznie implementowana.
W Cassandra różnica między kluczem podstawowym, kluczem partycji, kluczem złożonym, kluczem do klastrowania zawsze powoduje pewne zamieszanie. Więc wyjaśnię poniżej i będę odnosić się do siebie nawzajem. Używamy CQL (Cassandra Query Language) do dostępu do bazy danych Cassandra. Uwaga: - Odpowiedź jest zgodna ze zaktualizowaną wersją Cassandry.
Główny klucz :-
W Cassandra istnieją 2 różne sposoby korzystania z klucza podstawowego.
CREATE TABLE Cass (
id int PRIMARY KEY,
name text
);
Create Table Cass (
id int,
name text,
PRIMARY KEY(id)
);
W CQL kolejność definiowania kolumn dla KLUCZA PODSTAWOWEGO ma znaczenie. Pierwsza kolumna klucza nazywa się kluczem partycji posiadającym właściwość polegającą na tym, że wszystkie wiersze współdzielące ten sam klucz partycji (nawet w całej tabeli) są przechowywane w tym samym węźle fizycznym. Również wstawianie / aktualizacja / usuwanie w wierszach współużytkujących ten sam klucz partycji dla danej tabeli są wykonywane atomowo i oddzielnie. Zauważ, że możliwe jest posiadanie złożonego klucza partycji, tj. Klucza partycji utworzonego z wielu kolumn, za pomocą dodatkowego zestawu nawiasów, aby określić, które kolumny tworzą klucz partycji.
Partycjonowanie i klastrowanie
Definicja KLUCZA PODSTAWOWEGO składa się z dwóch części: klucza partycji i kolumn klastrowania. Pierwsza część jest mapowana na klucz wiersza silnika pamięci, a druga służy do grupowania kolumn w rzędzie.
Klucz podstawowy : składa się z kluczy partycji [i opcjonalnych kluczy klastrowych (lub kolumn)] Klucz partycji : Wartość skrótu klucza partycji służy do określenia określonego węzła w klastrze do przechowywania danych Klucz klastrowania : służy do sortuj dane w każdej partycji (lub w węźle odpowiedzialnym i jego replikach)
Złożony klucz główny : jak wspomniano powyżej, klucze klastrowania są opcjonalne w kluczu podstawowym. Jeśli nie są wymienione, jest to prosty klucz podstawowy. Jeśli wspomniane są klucze klastrowania, jest to klucz podstawowy złożony.
Złożony klucz partycji : użycie tylko jednej kolumny jako klucza partycji może powodować problemy z szerokimi wierszami (zależy od przypadku użycia / modelowania danych). Dlatego klucz partycji jest czasem określany jako kombinacja więcej niż jednej kolumny.
Jeśli chodzi o zamieszanie, które z nich jest obowiązkowe , które można pominąć itp. W zapytaniu, spróbuj wyobrazić sobie Cassandrę jako ogromną HashMap . Tak więc w HashMap nie można pobrać wartości bez klucza. Tutaj klawisze partycji pełnią rolę tego klucza. Dlatego każde zapytanie musi je określić. Bez którego Cassandra nie będzie wiedziała, którego węzła szukać.
Te klucze grupowania (kolumny, które są opcjonalne) pomagają w dalszych zawęzić wyszukiwanie zapytania po Cassandra dowie węzeł konkretny (i to replik) odpowiedzialny za tego konkretnego klucza podziału .
Klucz partycji to nic innego jak identyfikacja wiersza, przy czym identyfikacja to najczęściej pojedyncza kolumna (zwana kluczem podstawowym ), czasem kombinacja wielu kolumn (zwana kompozytowym kluczem partycji ).
Klucz klastra to nic innego jak indeksowanie i sortowanie . Klucze klastra zależą od kilku rzeczy:
Jakich kolumn używasz w klauzuli where z wyjątkiem kolumn klucza podstawowego.
Jeśli masz bardzo duże rekordy, to pod jakim względem mogę podzielić datę łatwego zarządzania. Przykład, mam dane z 1 miliona rekordów populacji hrabstwa. Aby ułatwić zarządzanie, grupuję dane na podstawie stanu i kodu PIN itd.
Klucz partycji NIE jest identyfikacją wiersza A ... identyfikuje grupę wierszy, z których wszystkie mają ten sam klucz partycji
wmac
1
Warto zauważyć, że prawdopodobnie użyjesz tych partii więcej niż w podobnych koncepcjach w świecie relacyjnym (klucze złożone).
Przykład - załóżmy, że musisz znaleźć ostatnich N użytkowników, którzy ostatnio dołączyli do grupy użytkowników X. W jaki sposób zrobiłbyś to skutecznie, biorąc pod uwagę odczyty, w tym przypadku dominują? Tak (z oficjalnego przewodnika Cassandra ):
CREATE TABLE group_join_dates (
groupname text,
joined timeuuid,
join_date text,
username text,
email text,
age int,
PRIMARY KEY ((groupname, join_date), joined)
) WITH CLUSTERING ORDER BY (joined DESC)
Tutaj partycjonowanie klucza jest związek sobą a klucz klastrów jest dołączył data. Powodem, dla którego klucz klastrowania jest datą złączenia, jest to, że wyniki są już sortowane (i przechowywane, co sprawia, że wyszukiwanie jest szybkie). Ale dlaczego używamy klucza złożonego do podziału klucza ? Ponieważ zawsze chcemy czytać jak najmniej partycji . W jaki sposób umieszczenie w nim wartości join_date pomaga? Teraz użytkownicy z tej samej grupy i tej samej daty dołączenia będą znajdować się na jednej partycji! Oznacza to, że zawsze będziemy czytać jak najmniej partycji (najpierw zacznij od najnowszej, a następnie przejdź do starszej itd., Zamiast przeskakiwać między nimi).
W rzeczywistości, w ekstremalnych przypadkach, będziesz musiał użyć skrótu z Join_date zamiast samego Join_date - tak, że jeśli pytasz przez ostatnie 3 dni, często dzielą ten sam skrót i dlatego są dostępne z tej samej partycji!
Klucz podstawowy w Cassandra zwykle składa się z dwóch części - klucza partycji i kolumn klastrowania.
primary_key ((part_key), clustering_col)
Klucz partycji - pierwsza część klucza podstawowego. Głównym celem klucza partycji jest identyfikacja węzła, który przechowuje konkretny wiersz.
UTWÓRZ TABELĘ książka_telefoniczna (nr_telefonu, tekst imienia, wiek int, tekst miasta, KLUCZ PODSTAWOWY ((numer_ telefonu, imię), wiek);
Tutaj (numer_ telefonu, nazwa) to klucz partycji. Podczas wstawiania danych generowana jest wartość skrótu klucza partycji i ta wartość decyduje, do którego węzła powinien przejść wiersz.
Rozważ klaster 4-węzłowy, każdy węzeł ma zakres wartości skrótu, które może przechowywać. (Napisz) WSTAWIĆ DO WARTOŚCI książki telefonicznej (7826573732, „Joey”, 25, „Nowy Jork”);
Teraz wartość skrótu klucza partycji jest obliczana przez partycjoner Cassandra. powiedzmy, wartość skrótu (7826573732, „Joey”) → 12, teraz ten wiersz zostanie wstawiony do węzła C.
(Czytaj) WYBIERZ * Z KSIĄŻKI TELEFONICZNEJ GDZIE numer_przyczyny = 7826573732 i nazwa = „Joey”;
Teraz ponownie obliczana jest wartość skrótu klucza partycji (7826573732, „Joey”), która w naszym przypadku wynosi 12, a rezyduje ona w węźle C, z którego odbywa się odczyt.
Klastry kolumn - druga część klucza podstawowego. Głównym celem posiadania grupowania kolumn jest przechowywanie danych w posortowanej kolejności. Domyślnie kolejność jest rosnąca.
W kluczu podstawowym może znajdować się więcej niż jeden klucz partycji i kolumny klastrowe, w zależności od rozwiązanego zapytania.
{pracownik_id} jest jedynym minimalnym superkluczem, co czyni go również jedynym kluczem kandydującym - biorąc pod uwagę, że {imię} i {nazwisko} nie gwarantują wyjątkowości. Ponieważ klucz podstawowy jest zdefiniowany jako wybrany klucz kandydujący i w tym przykładzie istnieje tylko jeden klucz kandydujący, {identyfikator_ pracownika} jest minimalnym superkluczem, jedynym kluczem kandydującym i jedynym możliwym kluczem podstawowym.
Jedynym kluczem złożonym jest {identyfikator_ pracownika, imię, nazwisko}, ponieważ ten klucz zawiera klucz złożony ({identyfikator_ pracownika, imię}) i atrybut, który nie jest nadkluczem ({nazwisko}).
Odpowiedzi:
Jest wiele zamieszania wokół tego, postaram się uczynić to tak prostym, jak to możliwe.
Klucz podstawowy to ogólna koncepcja wskazująca jedną lub więcej kolumn używanych do pobierania danych z tabeli.
Klucz podstawowy może być PROSTY, a nawet zadeklarowany wbudowany:
Oznacza to, że składa się z jednej kolumny.
Ale kluczem podstawowym może być również KOMPOZYT (zwany ZWIĄZKIEM ), generowany z większej liczby kolumn.
W sytuacji klucza podstawowego KOMPOZYTOWEGO „pierwsza część” klucza nazywa się KLUCZEM PARTYCJI (w tym przykładzie klucz_part_one to klucz partycji), a drugą częścią klucza jest KLUCZ klastrowy (w tym przykładzie key_part_two )
Należy pamiętać, że zarówno partycja, jak i klucz klastrowania mogą być tworzone przez więcej kolumn , oto jak:
Za tymi nazwami ...
Dalsze informacje o użytkowaniu: DOKUMENTACJA DANYCH
Małe przykłady użycia i treści
PROSTY KLUCZ:
zawartość tabeli
KLUCZ KOMPOZYTOWY / ZWIĄZANY może wyszukiwać „szerokie wiersze” (tzn. Można wyszukiwać tylko za pomocą klucza partycji, nawet jeśli zdefiniowano klucze klastrowania)
zawartość tabeli
Ale możesz wykonać zapytanie za pomocą całego klucza (zarówno partycji, jak i klastrowania) ...
wynik zapytania
Ważna uwaga: klucz partycji jest minimalnym specyfikatorem potrzebnym do wykonania zapytania za pomocą
where clause
. Jeśli masz złożony klucz partycji, taki jak poniżejna przykład:
PRIMARY KEY((col1, col2), col10, col4))
Możesz wykonać zapytanie tylko przekazując co najmniej zarówno col1, jak i col2, są to 2 kolumny, które definiują klucz partycji. Zgodnie z ogólną zasadą zapytania należy przekazać co najmniej wszystkie kolumny kluczy partycji, a następnie można opcjonalnie dodać każdy klucz klastrowania w kolejności, w jakiej są ustawione.
więc prawidłowe zapytania to (z wyłączeniem indeksów wtórnych )
Nieważny:
Mam nadzieję że to pomoże.
źródło
Dodanie odpowiedzi podsumowującej jako zaakceptowanej jest dość długie. Terminy „wiersz” i „kolumna” są używane w kontekście CQL, a nie w jaki sposób Cassandra jest faktycznie implementowana.
Przykłady:
PRIMARY KEY (a)
: Klucz partycji toa
.PRIMARY KEY (a, b)
: Klucz partycji toa
klucz klastrowaniab
.PRIMARY KEY ((a, b))
: Złożony klucz partycji to(a, b)
.PRIMARY KEY (a, b, c)
: Klucz partycji jesta
, kluczem klastrowania kompozytowego jest(b, c)
.PRIMARY KEY ((a, b), c)
: Kluczem partycji kompozytowej jest(a, b)
klucz klastrowaniac
.PRIMARY KEY ((a, b), c, d)
: Złożony klucz partycji to(a, b)
kompozytowy klucz klastrowania(c, d)
.źródło
W Cassandra różnica między kluczem podstawowym, kluczem partycji, kluczem złożonym, kluczem do klastrowania zawsze powoduje pewne zamieszanie. Więc wyjaśnię poniżej i będę odnosić się do siebie nawzajem. Używamy CQL (Cassandra Query Language) do dostępu do bazy danych Cassandra. Uwaga: - Odpowiedź jest zgodna ze zaktualizowaną wersją Cassandry. Główny klucz :-
W Cassandra istnieją 2 różne sposoby korzystania z klucza podstawowego.
W CQL kolejność definiowania kolumn dla KLUCZA PODSTAWOWEGO ma znaczenie. Pierwsza kolumna klucza nazywa się kluczem partycji posiadającym właściwość polegającą na tym, że wszystkie wiersze współdzielące ten sam klucz partycji (nawet w całej tabeli) są przechowywane w tym samym węźle fizycznym. Również wstawianie / aktualizacja / usuwanie w wierszach współużytkujących ten sam klucz partycji dla danej tabeli są wykonywane atomowo i oddzielnie. Zauważ, że możliwe jest posiadanie złożonego klucza partycji, tj. Klucza partycji utworzonego z wielu kolumn, za pomocą dodatkowego zestawu nawiasów, aby określić, które kolumny tworzą klucz partycji.
Partycjonowanie i klastrowanie Definicja KLUCZA PODSTAWOWEGO składa się z dwóch części: klucza partycji i kolumn klastrowania. Pierwsza część jest mapowana na klucz wiersza silnika pamięci, a druga służy do grupowania kolumn w rzędzie.
W tym przypadku identyfikator_urządzenia jest kluczem partycji, a sprawdzony jest kluczem klastra.
Możemy mieć wiele kluczy klastrowych, a także klucz partycji, który zależy od deklaracji.
źródło
Klucz podstawowy : składa się z kluczy partycji [i opcjonalnych kluczy klastrowych (lub kolumn)]
Klucz partycji : Wartość skrótu klucza partycji służy do określenia określonego węzła w klastrze do przechowywania danych
Klucz klastrowania : służy do sortuj dane w każdej partycji (lub w węźle odpowiedzialnym i jego replikach)
Złożony klucz główny : jak wspomniano powyżej, klucze klastrowania są opcjonalne w kluczu podstawowym. Jeśli nie są wymienione, jest to prosty klucz podstawowy. Jeśli wspomniane są klucze klastrowania, jest to klucz podstawowy złożony.
Złożony klucz partycji : użycie tylko jednej kolumny jako klucza partycji może powodować problemy z szerokimi wierszami (zależy od przypadku użycia / modelowania danych). Dlatego klucz partycji jest czasem określany jako kombinacja więcej niż jednej kolumny.
Jeśli chodzi o zamieszanie, które z nich jest obowiązkowe , które można pominąć itp. W zapytaniu, spróbuj wyobrazić sobie Cassandrę jako ogromną HashMap . Tak więc w HashMap nie można pobrać wartości bez klucza.
Tutaj klawisze partycji pełnią rolę tego klucza. Dlatego każde zapytanie musi je określić. Bez którego Cassandra nie będzie wiedziała, którego węzła szukać.
Te klucze grupowania (kolumny, które są opcjonalne) pomagają w dalszych zawęzić wyszukiwanie zapytania po Cassandra dowie węzeł konkretny (i to replik) odpowiedzialny za tego konkretnego klucza podziału .
źródło
W skrócie:
Klucz partycji to nic innego jak identyfikacja wiersza, przy czym identyfikacja to najczęściej pojedyncza kolumna (zwana kluczem podstawowym ), czasem kombinacja wielu kolumn (zwana kompozytowym kluczem partycji ).
Klucz klastra to nic innego jak indeksowanie i sortowanie . Klucze klastra zależą od kilku rzeczy:
Jakich kolumn używasz w klauzuli where z wyjątkiem kolumn klucza podstawowego.
Jeśli masz bardzo duże rekordy, to pod jakim względem mogę podzielić datę łatwego zarządzania. Przykład, mam dane z 1 miliona rekordów populacji hrabstwa. Aby ułatwić zarządzanie, grupuję dane na podstawie stanu i kodu PIN itd.
źródło
Warto zauważyć, że prawdopodobnie użyjesz tych partii więcej niż w podobnych koncepcjach w świecie relacyjnym (klucze złożone).
Przykład - załóżmy, że musisz znaleźć ostatnich N użytkowników, którzy ostatnio dołączyli do grupy użytkowników X. W jaki sposób zrobiłbyś to skutecznie, biorąc pod uwagę odczyty, w tym przypadku dominują? Tak (z oficjalnego przewodnika Cassandra ):
Tutaj partycjonowanie klucza jest związek sobą a klucz klastrów jest dołączył data. Powodem, dla którego klucz klastrowania jest datą złączenia, jest to, że wyniki są już sortowane (i przechowywane, co sprawia, że wyszukiwanie jest szybkie). Ale dlaczego używamy klucza złożonego do podziału klucza ? Ponieważ zawsze chcemy czytać jak najmniej partycji . W jaki sposób umieszczenie w nim wartości join_date pomaga? Teraz użytkownicy z tej samej grupy i tej samej daty dołączenia będą znajdować się na jednej partycji! Oznacza to, że zawsze będziemy czytać jak najmniej partycji (najpierw zacznij od najnowszej, a następnie przejdź do starszej itd., Zamiast przeskakiwać między nimi).
W rzeczywistości, w ekstremalnych przypadkach, będziesz musiał użyć skrótu z Join_date zamiast samego Join_date - tak, że jeśli pytasz przez ostatnie 3 dni, często dzielą ten sam skrót i dlatego są dostępne z tej samej partycji!
źródło
Klucz podstawowy w Cassandra zwykle składa się z dwóch części - klucza partycji i kolumn klastrowania.
primary_key ((part_key), clustering_col)
Klucz partycji - pierwsza część klucza podstawowego. Głównym celem klucza partycji jest identyfikacja węzła, który przechowuje konkretny wiersz.
UTWÓRZ TABELĘ książka_telefoniczna (nr_telefonu, tekst imienia, wiek int, tekst miasta, KLUCZ PODSTAWOWY ((numer_ telefonu, imię), wiek);
Tutaj (numer_ telefonu, nazwa) to klucz partycji. Podczas wstawiania danych generowana jest wartość skrótu klucza partycji i ta wartość decyduje, do którego węzła powinien przejść wiersz.
Rozważ klaster 4-węzłowy, każdy węzeł ma zakres wartości skrótu, które może przechowywać. (Napisz) WSTAWIĆ DO WARTOŚCI książki telefonicznej (7826573732, „Joey”, 25, „Nowy Jork”);
Teraz wartość skrótu klucza partycji jest obliczana przez partycjoner Cassandra. powiedzmy, wartość skrótu (7826573732, „Joey”) → 12, teraz ten wiersz zostanie wstawiony do węzła C.
(Czytaj) WYBIERZ * Z KSIĄŻKI TELEFONICZNEJ GDZIE numer_przyczyny = 7826573732 i nazwa = „Joey”;
Teraz ponownie obliczana jest wartość skrótu klucza partycji (7826573732, „Joey”), która w naszym przypadku wynosi 12, a rezyduje ona w węźle C, z którego odbywa się odczyt.
W kluczu podstawowym może znajdować się więcej niż jeden klucz partycji i kolumny klastrowe, w zależności od rozwiązanego zapytania.
primary_key ((pk1, pk2), col 1, col2)
źródło
W projekcie bazy danych klucz złożony to zbiór superkluczy, które nie są minimalne.
Klucz złożony to zestaw zawierający klucz złożony i co najmniej jeden atrybut, który nie jest superkluczem
Podana tabela: PRACOWNICY {identyfikator pracownika, imię, nazwisko}
Możliwe skróty to:
{pracownik_id} jest jedynym minimalnym superkluczem, co czyni go również jedynym kluczem kandydującym - biorąc pod uwagę, że {imię} i {nazwisko} nie gwarantują wyjątkowości. Ponieważ klucz podstawowy jest zdefiniowany jako wybrany klucz kandydujący i w tym przykładzie istnieje tylko jeden klucz kandydujący, {identyfikator_ pracownika} jest minimalnym superkluczem, jedynym kluczem kandydującym i jedynym możliwym kluczem podstawowym.
Wyczerpująca lista kluczy złożonych to:
Jedynym kluczem złożonym jest {identyfikator_ pracownika, imię, nazwisko}, ponieważ ten klucz zawiera klucz złożony ({identyfikator_ pracownika, imię}) i atrybut, który nie jest nadkluczem ({nazwisko}).
źródło