我有一个类似于此的Cassandra架构:
CREATE TABLE table1 (a1 text,
a2 text,
b1 text,
b2 text,
c1 text,
c2 text,
PRIMARY KEY ( (a1, a2), b1, b2) )
);
这是时间序列数据。 a1是我的id,a2是我的时间桶 问题:如何正确选择整个时间段?
我可以选择a1或a2。但是如果我按a1和a2选择请求超时。
SELECT * FROM table1 WHERE a1 = 'id1' AND a2 = 'time_bucket37' LIMIT 100 ALLOW FILTERING;
结果:请求未在rpc_timeout内完成。
这是我的::
cqlsh:testmulti1> DESCRIBE TABLE datasimple;
CREATE TABLE datasimple (
dc_name text,
time_bucket text,
partition int,
perf_name text,
vm_name text,
measurement_time timestamp,
perf_data int,
platform text,
PRIMARY KEY ((dc_name, time_bucket, partition), perf_name, vm_name, measurement_time)
) WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.000000 AND
gc_grace_seconds=864000 AND
index_interval=128 AND
read_repair_chance=0.100000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
default_time_to_live=0 AND
speculative_retry='99.0PERCENTILE' AND
memtable_flush_period_in_ms=0 AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'LZ4Compressor'};
CREATE INDEX datasimple_dc_name_idx_10 ON datasimple (dc_name);
CREATE INDEX datasimple_time_bucket_idx_10 ON datasimple (time_bucket);
CREATE INDEX datasimple_perf_name_idx_10 ON datasimple (perf_name);
CREATE INDEX datasimple_vm_name_idx_10 ON datasimple (vm_name);
CREATE INDEX datasimple_platform_idx_10 ON datasimple (platform);
我想:
SELECT *
FROM DataSimple
WHERE dc_name = 'dc1'
AND time_bucket = '2014031922'
AND vm_name = 'vm1' LIMIT 1000;
答案 0 :(得分:4)
SELECT *
FROM DataSimple
WHERE dc_name = 'dc1'
AND time_bucket = '2014031922'
AND vm_name = 'vm1'
LIMIT 1000;
那不行。您当前的PRIMARY KEY
是:
PRIMARY KEY ((dc_name, time_bucket, partition),
perf_name, vm_name, measurement_time)
尝试将Cassandra中的复合PRIMARY KEY视为分层路径,从左到右开始。 dc_name
,time_bucket
和partition
是您的分区键的一部分,因此您需要在WHERE
中添加每一项,以确保Cassandra可以找到您的数据已存储。
之后的所有列都是群集列(perf_name
,vm_name
和measurement_time
),这些列确定了磁盘上数据的排序顺序。同样,您无法选择要包含哪些内容。您需要按照在架构中定义它们的顺序搜索它们。因此,如果您想按vm_name
进行查询,那么您还需要确保前面的列键(在这种情况下为perf_name
)也出现在WHERE
子句中。
基本上要查询此架构,请将AND
添加到WHERE
子句中: