문제
다음과 유사한 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 AND 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;
해결책
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
다음에 대한 조항:
- 분할
- 성능_이름
제휴하지 않습니다 StackOverflow