내 테이블 samples
은 다음과 같은 열로 구성됩니다.
id : uuid
created : timestamp
device : ascii
reading : float
내 쿼리의 대부분은 n
모든 장치 에서 가장 최근 샘플 을 가져 오는 것이기 때문에 이것이 기본 정렬이되기를 원합니다.
SELECT * FROM samples LIMIT 1024
또한 n
주어진 장치에 대한 최신 샘플 을 효율적으로 가져올 수 있기를 바랍니다 .
SELECT * FROM samples WHERE device = 'abc' LIMIT 1024
이를 위해 파티션 키를 어떻게 디자인해야합니까?
Cassandra에서는 쿼리 기반 모델링 접근 방식을 사용하는 것이 좋습니다. 이를 위해 지원해야하는 각 쿼리에 대해 하나의 테이블을 갖는 것은 드문 일이 아닙니다.
SELECT * FROM samples LIMIT 1024
이 첫 번째 쿼리에서 내가 바로 보는 가장 큰 문제는 WHERE
절이 없다는 것입니다 . 이로 인해 Cassandra는 결과 집합을 만들기 위해 모든 노드를 확인해야합니다. 확실히 그런 일이 일어나기를 원하지 않습니다. 그러나 최근 데이터 또는 특정 날짜의 데이터에 가장 관심이있는 것 같습니다. 이렇게하려면 날짜 / 시간 구성 요소를 기반으로 파티션 키 또는 "버킷"을 만들어야합니다.
여러 파티션에서 검색된 데이터를 정렬 할 수 없기 때문에이 작업도 필요합니다.
이를 위해 데이터의 카디널리티가 중요합니다. 당신은 상위 1024 개를 선택하고 있는데 하루에 그렇게 많이 얻는 것이 일반적입니까? 아니면 일주일 이상입니까? 지금은 "day"라고 가정하고 day_bucket
열을 추가합니다 .
CREATE TABLE samples_by_day (
id uuid,
created timestamp,
device ascii,
reading float,
day_bucket bigint,
PRIMARY KEY (day_bucket,created,id)
) WITH CLUSTERING ORDER BY (created DESC, id ASC);
이 기본 키 정의는 데이터를 일별로 분할합니다 (예 : 20200710). 이러한 파티션 내에서 데이터는 created
내림차순 으로 정렬됩니다 (최신 항목을 맨 위에 표시). id
열 고유성을 보장하기 위해 추가된다. 이것은 다음 쿼리를 지원합니다.
SELECT * FROM samples_by_day
WHERE day_bucket = 20200710 LIMIT 1024;
며칠 동안 여러 쿼리를 실행할 수 있습니다. 20 억 셀 / 파티션 제한의 한계를 넘지 않는다고 가정하면 주 또는 월 단위로 "버킷"할 수도 있습니다.
이 쿼리 지원 :
SELECT * FROM samples
WHERE device = 'abc' LIMIT 1024;
... 훨씬 쉽습니다.
CREATE TABLE samples_by_device (
id uuid,
created timestamp,
device ascii,
reading float,
day_bucket bigint,
PRIMARY KEY (device,created,id)
) WITH CLUSTERING ORDER BY (created DESC, id ASC);
이 방법은 작동하지만 "제한되지 않은 행 증가"문제가 발생할 수 있습니다. 기본적으로 각 장치에 대해 장치 샘플이 계속 추가되면 파티션 크기가 결국 최대가됩니다. 따라서 추가 day_bucket
파티션 키로 추가 (또는 작동하는 시간 버킷)가 필요할 수 있습니다.
PRIMARY KEY ((device,day_bucket),created,id)
이 변경으로 쿼리도 변경해야합니다.
SELECT * FROM samples_by_device
WHERE device = 'abc' AND day_bucket = 20200710 LIMIT 1024;
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다