Range Queries in Cassandra (CQL 3.0)

keelar picture keelar · Aug 13, 2013 · Viewed 21.5k times · Source

One main part of Cassandra that I don't fully understand is its range queries. I know that Cassandra emphasizes distributed environment and focuses on performance, but probably because of that, it currently only support several types of ranges queries that it can finish efficiently, and what I would like to know is that: which types of range queries are supported by Cassandra.

As far as I know, Cassandra supports the following range queries:

1: Range Queries on Primary key with keyword TOKEN, for example:

 CREATE TABLE only_int (int_key int PRIMARY KEY);
 ...
 select * from only_int where token(int_key) > 500;

2: Range Queries with one equality condition on a secondary index with keyword ALLOW FILTERING, for example:

CREATE TABLE example (
  int_key int PRIMARY KEY,
  int_non_key int,
  str_2nd_idx ascii
);
CREATE INDEX so_example_str_2nd_idx ON example (str_2nd_idx);
...
select * from example where str_2nd_idx = 'hello' and int_non_key < 5 allow filtering;

But I am wondering if I miss something and looking for a canonical answer which lists all types of range queries supported by the current CQL (or some work-around that allows more types of range queries).

Answer

Zain Malik picture Zain Malik · May 21, 2014

You can look for clustering keys. A primary key can be formed by a partitioning key and then by clustering keys.

for example definition like this one

CREATE TABLE example (
  int_key int,
  int_non_key int,
  str_2nd_idx ascii,
  PRIMARY KEY((int_key), str_2nd_idx)
);

will allow to you make queries like these without using token

select * from example where str_2nd_idx < 'hello' allow filtering;

Before creating a TABLE in cassandra you should start from thinking about queries and what you want to ask from the data model in cassandra.