2010-12-29 9 views
7

Sto provando a impostare una famiglia di colonne cassandra con indici secondari su alcune colonne che dovrò filtrare durante la lettura dei dati. Nei miei test iniziali, quando uso più indici contemporaneamente, le cose rallentano. Ecco come l'ho configurato attualmente (via cassandra-cli):Indici composti in Apache Cassandra

update column family bulkdata with comparator=UTF8Type and column_metadata=[{column_name: test_field, validation_class: UTF8Type}, {column_name: create_date, validation_class: LongType, index_type: KEYS}, {column_name: domain, validation_class: UTF8Type, index_type: KEYS}]; 

voglio ottenere tutti i dati in cui create_date> somevalue1 e column_name = somevalue2. Utilizzando pycassa per il mio cliente faccio la seguente:

domain_expr = create_index_expression('domain', 'whatever.com') 
    cd_expr = create_index_expression('create_date', 1293650000, GT) 
    clause = create_index_clause([domain_expr, cd_expr], count=10000) 
    for key, item in col_fam.get_indexed_slices(clause): 
    ... 

Questo è un errore comune in SQL, naturalmente, dove si sarebbe normalmente per creare un indice composto, in base alle esigenze di query. Sono abbastanza nuovo a Cassandra, quindi, non so se una cosa del genere sia richiesta o esista.

Le mie interazioni con cassandra includeranno un numero elevato di scritture e un gran numero di letture e aggiornamenti. Ho creato gli indici per capire che erano la cosa giusta da fare qui, ma forse ho torto completamente. Sarei interessato a qualsiasi idea per la creazione di un sistema performante, con la mia configurazione dell'indice o senza.

oh, e questo è in cassandra 0.7.0-RC3

+2

È normale che più clausole per aumentare il tempo di query, entro limiti ragionevoli. Puoi dare maggiori dettagli? Quante righe hai inserito? Quale distribuzione di valori tra le colonne che stai interrogando? – jbellis

+0

Per ora, i valori sono tutti dati casuali all'interno di un intervallo. Per i miei test finora ho circa 1 milione di righe. Per i dati nei coulmi, create_date è randomizzato in modo che tutti i valori siano all'interno dello stesso anno, il dominio è un nome di dominio preso a caso da un elenco di 8 e test_field è un carattere casuale. – Jake

risposta

8

Native Cassandra indici secondari hanno alcune limitazioni. Non dovrebbero essere usati per colonne con alta cardinalità (troppi valori unici), secondo la documentazione datastax. Sembra che la colonna create_date su cui stai indicizzando abbia una cardinalità elevata. Inoltre, non esiste un indice composto nel supporto dell'indice di Cassandra nativo.

Per ulteriori approfondimenti in, potete visitare il mio post sul blog http://pkghosh.wordpress.com/2011/03/02/cassandra-secondary-index-patterns/

Pranab