2012-08-11 7 views
23

Przeczytałem w najnowszym wydaniu, że super kolumny nie są pożądane ze względu na "problemy z wydajnością", ale nie gdzie to jest wyjaśnione.Dlaczego superkolumny w Cassandrze nie są już faworyzowane?

Następnie czytam artykuły takie jak this one, które dają wspaniałe wzorce indeksowania przy użyciu super-kolumn.

Dzięki temu nie mam pojęcia, co to jest obecnie najlepszy sposób indeksowania w Cassandrze.

  1. Jakie są problemy z wydajnością super-kolumn?
  2. Gdzie mogę znaleźć bieżące najlepsze praktyki indeksowania?
+2

To jest doskonałe pytanie. Wydaje mi się, że ten blog techniczny w serwisie eBay ma ładny i mało zaawansowany technicznie (nie ma wiele szczegółów technicznych) przegląd zoptymalizowanej architektury. http://www.ebaytechblog.com/2012/07/16/cassandra-data-modeling-best-practices-part-1/ Jednak jeśli jesteś w prawdziwym świecie, lepiej przeczytaj każdy dziennik zmian i mapę drogową, aby uzyskać lepiej czuć, gdzie i jakie są problemy oraz w jaki sposób są rozwiązywane. To za dużo czytania i byłoby miło, gdyby można było gdzieś usystematyzować, ale nie mogę też znaleźć zbyt wiele w Internecie. –

Odpowiedz

31

Super kolumny mają wiele problemów, między innymi dlatego, że Cassandra musi deserialze wszystkie podkolumny super-kolumny podczas zapytania (nawet jeśli wynik zwróci tylko małą wartość). podzbiór). W rezultacie istnieje praktyczny limit liczby pod-kolumn na jedną kolumnę, które mogą być przechowywane przed wystąpieniem wydajności.

Teoretycznie można to naprawić w Cassandrze przez odpowiednie indeksowanie kolumn podrzędnych, ale zgoda jest taka, że ​​złożone kolumny są lepszym rozwiązaniem i działają bez dodatkowej złożoności.

Najprostszym sposobem wykorzystania kolumn kompozytowych jest skorzystanie z abstrakcji, którą zapewnia CQL 3. Rozważmy następujący schemat:

CREATE TABLE messages(
    username text, 
    sent_at timestamp, 
    message text, 
    sender text, 
    PRIMARY KEY(username, sent_at) 
); 

Nazwa tutaj jest klucz wiersz, ale używaliśmy klucz podstawowy definicję, która tworzy zgrupowanie klucza wiersza i kolumny sent_at. Jest to ważne, ponieważ powoduje indeksowanie tego atrybutu.

INSERT INTO messages (username, sent_at, message, sender) VALUES ('bob', '2012-08-01 11:42:15', 'Hi', 'alice'); 
INSERT INTO messages (username, sent_at, message, sender) VALUES ('alice', '2012-08-01 11:42:37', 'Hi yourself', 'bob'); 
INSERT INTO messages (username, sent_at, message, sender) VALUES ('bob', '2012-08-01 11:43:00', 'What are you doing later?', 'alice'); 
INSERT INTO messages (username, sent_at, message, sender) VALUES ('bob', '2012-08-01 11:47:14', 'Bob?', 'alice'); 

Za kulisami Cassandra będzie przechowywać powyżej wstawionego danych coś takiego:

alice: (2012-08-01 11:42:37,message): Hi yourself, (2012-08-01 11:42:37,sender): bob 
bob: (2012-08-01 11:42:15,message): Hi,   (2012-08-01 11:42:15,sender): alice, (2012-08-01 11:43:00,message): What are you doing later?, (2012-08-01 11:43:00,sender): alice (2012-08-01 11:47:14,message): Bob?, (2012-08-01 11:47:14,sender): alice 

ale stosując CQI 3, możemy kwerendy „wiersz” przy użyciu sent_at orzecznik i wrócić tabelarycznym zestaw wyników.

SELECT * FROM messages WHERE username = 'bob' AND sent_at > '2012-08-01'; 
username | sent_at     | message     | sender 
----------+--------------------------+---------------------------+-------- 
     bob | 2012-08-01 11:43:00+0000 | What are you doing later? | alice 
     bob | 2012-08-01 11:47:14+0000 |      Bob? | alice 
+0

Dzięki! Mówiąc o kluczach złożonych, czy Cassandra jest w stanie efektywnie wykonywać zapytania o zakres w każdej kolumnie? WYBIERZ * gdzieś GDZIE a> 3 I a <= 12 I b IN (1, 3, 6) I c> 17 itd., Zakładając, że klucz to a, b, c. – IamIC

+0

Czy nazwa kolumny złożonej (wielokomponentowej) jest lepsza w tym przypadku? – IamIC

+0

możesz na to spojrzeć: http://stackoverflow.com/questions/11978386/cassandra-1-1-storage-engine – IamIC

Powiązane problemy