CREATE TABLE gsg.callback_queue (
key blob,
column1 bigint,
column2 text,
value blob,
PRIMARY KEY (key, column1, column2)
) WITH COMPACT STORAGE
AND CLUSTERING ORDER BY (column1 ASC, column2 ASC)
AND caching = '{"keys":"ALL", "rows_per_partition":"NONE"}'
AND comment = ''
AND compaction = {'class': 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy'}
AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND dclocal_read_repair_chance = 0.1
AND default_time_to_live = 0
AND gc_grace_seconds = 43200
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = 'NONE';
我执行以下查询:
select * from callback_queue
where column2='167-df8fb9d8-13b0-418e-b21b-f5599c7819fc' allow filtering;
但它抛出了这样的异常:
message =“PRIMARY KEY列”column2“不能被限制(在前 列“column1”不受限制)
然后我使用第二个索引:
create index idx callback_queue(column2);
但它抛出了这样的异常:
COMPACT中的PRIMARY KEY列不支持辅助索引 存储表
那么,我怎么不能用column2获取原始数据?
答案 0 :(得分:0)
在您的表中,列key
是分区键,因此在执行where
子句查询时应该存在。
您可以更改架构,也可以从支持给定查询的父表创建materialised view
。
CREATE MATERIALIZED VIEW gsg.callback_queue_by_column2 AS
SELECT key, column1, column2, value
FROM gsg.callback_queue
WHERE key IS NOT NULL AND column1 IS NOT NULL AND column2 IS NOT NULL AND value IS NOT NULL
PRIMARY KEY (column2, key, column1);
现在,以下查询将有效。
select * from callback_queue_by_column2 where column2='167-df8fb9d8-13b0-418e-b21b-f5599c7819fc';
答案 1 :(得分:0)
在主键中,第一部分是分区键,第二部分是聚类列。
主键(分区键,聚类列);
定义主键时,您可以使用复合键或复合键。
复合键
多列主键称为复合键:主键(分区键,聚类列);
复合键
基于多列的分区键:主键((分区键1,分区键2));
如果使用复合键,则查询中的where子句应包含用于定义分区键的所有列。
在您的情况下,主键列“key”应该是where子句的一部分。
答案 2 :(得分:0)
我建议你不要使用ALLOW FILTERING子句,尤其是在包含大量事务的生产数据库中(我不知道这是不是你的情况)。在您的情况下,群集中的所有节点都将执行大量操作来回答查询。
并且,正如错误所示,您无法为主键列创建索引。如果确实需要在column2上创建索引,则不应将column2用作主键的一部分。
如果您希望Cassandra表现良好,拥有一个好的数据模型非常重要。因此,我建议您至少学习Cassandra数据建模的基础知识。
在Cassandra中,通过提前考虑您的查询来建模数据是一种很好的做法,即在开始数据建模之前先了解您的查询是一件好事。如有必要,还要对数据模型进行非规范化。在Cassandra中,可以在多个表中复制数据。
因此,在您的情况下,我猜您应该创建另一个表,并且此表应该具有column2的分区键。你也应该在这个新表中复制你的数据。