Cassandra DB:为什么少于查询失败?
Cassandra DB: Why less than query failed?
我创建了一个 KEYSPACE 和一个 TABLE,其中一个 uuid 列作为主键,一个时间戳列使用索引。这一切都成功了,如下图所示:
cassandra@cqlsh:my_keyspace> insert into my_test ( id, insert_time, value ) values ( uuid(), '2015-03-12 09:10:30', '111' );
cassandra@cqlsh:my_keyspace> insert into my_test ( id, insert_time, value ) values ( uuid(), '2015-03-12 09:20:30', '222' );
cassandra@cqlsh:my_keyspace> select * from my_test;
id | insert_time | value
--------------------------------------+--------------------------+-------
9d7f88bc-5cb9-463f-b679-fd66e6469eb5 | 2015-03-12 09:20:30+0000 | 222
69579f6f-bf88-493b-a1d6-2f89fac25650 | 2015-03-12 09:10:30+0000 | 111
(2 rows)
现在查询
cassandra@cqlsh:my_keyspace> select * from my_test where insert_time = '2015-03-12 09:20:30';
id | insert_time | value
--------------------------------------+--------------------------+-------
9d7f88bc-5cb9-463f-b679-fd66e6469eb5 | 2015-03-12 09:20:30+0000 | 222
(1 rows)
现在查询小于:
cassandra@cqlsh:my_keyspace> select * from my_test where insert_time < '2015-03-12 09:20:30';
InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on the restricted columns support the provided operators: 'insert_time < <value>'"
虽然第一次查询成功了,但为什么会这样?我应该如何使第二个查询成功,因为这正是我想要的?
您可以在自己的机器上测试所有这些。谢谢
CREATE TABLE my_test (
id uuid PRIMARY KEY,
insert_time timestamp,
value text
) ;
CREATE INDEX my_test_insert_time_idx ON my_keyspace.my_test (insert_time);
Cassandra 范围查询非常有限。它归结为性能和数据存储机制。范围查询必须具有以下内容:
命中一个(或几个带有 IN 的)分区键,并在查询中除最后一个之外的所有连续聚簇键上包括精确匹配,您可以对其进行范围查询。
假设你的PK是(a,b,c,d),那么允许如下:
- 其中 a=a1 且 b < b1
- 其中 a=a1 且 b=b1 且 c < c1
以下不是:
- 其中 a=a1 且 c < 1
[我不会在这里进入允许过滤...避免它。]
二级索引必须完全匹配。你不能对它们进行范围查询。
我创建了一个 KEYSPACE 和一个 TABLE,其中一个 uuid 列作为主键,一个时间戳列使用索引。这一切都成功了,如下图所示:
cassandra@cqlsh:my_keyspace> insert into my_test ( id, insert_time, value ) values ( uuid(), '2015-03-12 09:10:30', '111' );
cassandra@cqlsh:my_keyspace> insert into my_test ( id, insert_time, value ) values ( uuid(), '2015-03-12 09:20:30', '222' );
cassandra@cqlsh:my_keyspace> select * from my_test;
id | insert_time | value
--------------------------------------+--------------------------+-------
9d7f88bc-5cb9-463f-b679-fd66e6469eb5 | 2015-03-12 09:20:30+0000 | 222
69579f6f-bf88-493b-a1d6-2f89fac25650 | 2015-03-12 09:10:30+0000 | 111
(2 rows)
现在查询
cassandra@cqlsh:my_keyspace> select * from my_test where insert_time = '2015-03-12 09:20:30';
id | insert_time | value
--------------------------------------+--------------------------+-------
9d7f88bc-5cb9-463f-b679-fd66e6469eb5 | 2015-03-12 09:20:30+0000 | 222
(1 rows)
现在查询小于:
cassandra@cqlsh:my_keyspace> select * from my_test where insert_time < '2015-03-12 09:20:30';
InvalidRequest: code=2200 [Invalid query] message="No secondary indexes on the restricted columns support the provided operators: 'insert_time < <value>'"
虽然第一次查询成功了,但为什么会这样?我应该如何使第二个查询成功,因为这正是我想要的?
您可以在自己的机器上测试所有这些。谢谢
CREATE TABLE my_test (
id uuid PRIMARY KEY,
insert_time timestamp,
value text
) ;
CREATE INDEX my_test_insert_time_idx ON my_keyspace.my_test (insert_time);
Cassandra 范围查询非常有限。它归结为性能和数据存储机制。范围查询必须具有以下内容:
命中一个(或几个带有 IN 的)分区键,并在查询中除最后一个之外的所有连续聚簇键上包括精确匹配,您可以对其进行范围查询。
假设你的PK是(a,b,c,d),那么允许如下:
- 其中 a=a1 且 b < b1
- 其中 a=a1 且 b=b1 且 c < c1
以下不是:
- 其中 a=a1 且 c < 1
[我不会在这里进入允许过滤...避免它。]
二级索引必须完全匹配。你不能对它们进行范围查询。