Dokumentacja Cassandra stwierdza,
Nie używaj indeksu w następujących sytuacjach:
- W kolumnach o wysokiej liczności, ponieważ następnie przeszukujesz ogromną liczbę rekordów w celu uzyskania niewielkiej liczby wyników. Zobacz problemy przy użyciu indeksu kolumny o wysokiej liczności poniżej.
To idzie,
Jeśli utworzysz indeks w kolumnie o wysokiej liczności, która ma wiele różnych wartości, zapytanie między polami spowoduje wiele prób uzyskania bardzo niewielu wyników. W tabeli z miliardem piosenek wyszukiwanie piosenek według pisarza (wartość, która jest zwykle unikalna dla każdej piosenki) zamiast według ich wykonawcy, może być bardzo nieefektywne. Prawdopodobnie bardziej efektywne byłoby ręczne utrzymywanie tabeli jako formy indeksu zamiast korzystania z wbudowanego indeksu Cassandra. W przypadku kolumn zawierających unikalne dane czasami wygodniej jest używać indeksu dla wygody, o ile wolumin zapytania do tabeli mającej indeksowaną kolumnę jest umiarkowany i nie jest pod stałym obciążeniem.
Ale tak naprawdę nigdy nie odpowiada na pytanie: dlaczego jest nieefektywne? Nie mam pojęcia, co oznacza „ręczne utrzymywanie tabeli jako formy indeksu”. Ale w pewnym sensie jest to sprzeczne z „… czasem wygodnym jest użycie indeksu dla wygody, o ile objętość zapytania jest umiarkowana…”
Czy to po prostu próbuje mi powiedzieć, żebym używał PK, kiedy i gdzie mogę? Jaka jest nieefektywność? Rozumiem, że zapytanie, które trafiłoby do indeksu, musiałoby wykonać zapytanie do każdego węzła w klastrze, a następnie każdy węzeł przeprowadziłby wyszukiwanie w swoim lokalnym indeksie, a wyniki zostałyby następnie zagregowane. To niekoniecznie jest drogie (każde wyszukiwanie indeksu powinno być dość tanie), z wyjątkiem tego, że płacimy za opóźnienie w sieci, ponieważ musimy czekać na najwolniejszy węzeł partii. Czy coś tu brakuje?
Ale jeśli mam kolekcję zawierającą bajillion przedmiotów, które - w rzadkich przypadkach - muszą zostać wyszukane za pomocą innego, ale prawie unikalnego atrybutu… jest to właściwe zastosowanie, prawda?
¹Każdy? IDK, jeśli replikacja oznacza, że może to trafić 1/3 klastra dla współczynnika replikacji 3, czy nie?