La documentazione di Cassandra afferma che
Non utilizzare un indice in queste situazioni:
- Su colonne con cardinalità elevata perché esegui una query su un enorme volume di record per un numero limitato di risultati. Vedere Problemi con l'utilizzo di un indice di colonna con cardinalità elevata di seguito.
Si prosegue,
Se si crea un indice su una colonna con cardinalità elevata, che ha molti valori distinti, una query tra i campi comporterà molte ricerche per ottenere pochissimi risultati. Nella tabella con un miliardo di canzoni, cercare le canzoni dello scrittore (un valore che in genere è unico per ogni canzone) anziché dal loro artista, è probabilmente molto inefficiente. Probabilmente sarebbe più efficiente mantenere manualmente la tabella come una forma di un indice invece di usare l'indice incorporato di Cassandra. Per le colonne che contengono dati univoci, a volte è consigliabile utilizzare un indice per comodità, purché il volume di query nella tabella con una colonna indicizzata sia moderato e non sotto carico costante.
Ma non risponde mai veramente alla domanda: perché è inefficiente? Non ho idea di cosa significhi "mantenere manualmente la tabella come forma di un indice". Ma poi si contraddice in qualche modo con "... a volte è utile usare un indice per comodità purché il volume delle query sia moderato ..."
Sta solo cercando di dirmi di usare il PK quando e dove posso? Qual è l'inefficienza? La mia comprensione è che una query che colpirebbe un indice avrebbe bisogno di interrogare ogni nodo¹ del cluster, e quindi ogni nodo farebbe una ricerca nel suo indice locale e i risultati verrebbero quindi aggregati. Questo non è necessariamente costoso (ogni ricerca di indice dovrebbe essere abbastanza economica) tranne per il fatto che paghiamo in latenza di rete, poiché dobbiamo attendere il nodo più lento del lotto. Mi manca qualcosa qui?
Ma se ho una collezione che ha un bajillion di articoli che - in rare occasioni - deve essere cercata da un attributo diverso ma quasi unico ... questo è un uso appropriato, giusto?
¹Every? IDK se la replica significa che questo può colpire 1/3 del cluster per un fattore di replica di 3 o no?