2017-03-03 3 views
1

J'évalue l'utilisation de Cassandra pour une solution qui devra interroger une clé de partition et obtenir les 100 premiers résultats triés par colonne de priorité, qui ne sera pas dans Clustered Key. Je demande seulement par clé shard.ORDER BY index secondaire dans Cassandra

CREATE TABLE my_table (
shard_key int, 
enity_id int, 
priority int, 
PRIMARY KEY ((shard_key), entity_id) 
); 
CREATE INDEX prio ON my_table (priority); 

Puis-je écrire une requête CQL efficace comme

SELECT * FROM my_table WHERE shard_key=1 ORDER BY priority LIMIT 100 

Est-il possible de Cassandra ou devrais-je chercher ailleurs?

+0

Quelle version de Cassandra utilisez-vous? –

+0

@AshrafulIslam Peu importe, ça peut être n'importe quoi. Mise à jour: j'ai oublié de mentionner que je demande seulement par clé shard. – Cortlendt

Répondre

1

Dans Cassandra 3.0 a introduit la vue matérialisée
Si vous utilisez cassandra 3.0 ou une version supérieure, vous pouvez utiliser la vue matérialisée à l'ordre par la clef primaire

Créer une vue matérialisée comme celui-ci:

CREATE MATERIALIZED VIEW my_table_view AS 
    SELECT shard_key, priority, entity_id 
    FROM my_table 
    WHERE shard_key IS NOT NULL AND priority IS NOT NULL AND entity_id IS NOT NULL 
    PRIMARY KEY (shard_key, priority, entity_id); 

Supposons que vous ayez ces données sur my_table:

shard_key | entity_id | priority 
-----------+-----------+---------- 
     1 |  10 |  100 
     1 |  11 |  101 
     1 |  12 |  102 
     1 |  13 |  103 
     2 |  20 |  200 

Maintenant, vous pouvez interroger comme celui-ci:

SELECT * FROM my_table_view WHERE shard_key = 1 ORDER BY priority ASC LIMIT 100; 

La sortie sera:

shard_key | priority | entity_id 
-----------+----------+----------- 
     1 |  100 |  10 
     1 |  101 |  11 
     1 |  102 |  12 
     1 |  103 |  13 
+0

juste une question avant que j'accepte la réponse - Cela signifie que vous ne pouvez pas commander par colonne non-clé même si vous avez un index sur elle et les données résident dans une clé de partion? – Cortlendt

+0

@Cortlendt Vous ne pouvez pas utiliser order by sur un champ indexé –

0

En tant que solution de rechange, vous voudrez peut-être envisager de Stratio’s Lucene indexes à l'ordre par une colonne indexée.