문제

다음 테이블 구조가있는 5 억 행 MySQL 테이블을 고려하십시오 ...

CREATE TABLE foo_objects (
  id int NOT NULL AUTO_INCREMENT,
  foo_string varchar(32),
  metadata_string varchar(128),
  lookup_id int,
  PRIMARY KEY (id),
  UNIQUE KEY (foo_string),
  KEY (lookup_id),
);

... 다음 두 쿼리 만 사용하여 쿼리됩니다 ...

# lookup by unique string key, maximum of one row returned
SELECT * FROM foo_objects WHERE foo_string = ?;
# lookup by numeric lookup key, may return multiple rows
SELECT * FROM foo_objects WHERE lookup_id = ?;

이러한 쿼리가 주어지면 Cassandra를 사용하여 주어진 데이터 세트를 어떻게 표현합니까?

도움이 되었습니까?

해결책

두 가지 옵션이 있습니다.

(1)는 전통적인 전통입니다. foo 객체와 함께 하나의 CF (Columnfamily), foo 당 1 행, 필드 당 하나의 열이 있습니다. 그런 다음 하나의 행 키가 문자열 값이고 다른 하나의 행 키는 Lookup_id입니다. 인덱스 행의 열은 FOO ID입니다. 따라서 INDEX CF를 얻은 다음 IDS의 멀티 펫이 반환됩니다.

ID를 lookup_id와 동일하게 만들 수 있다면 유지 보수에 대한 색인이 적습니다.

Digg 's Lazyboy와 같은 고급 고객 (http://github.com/digg/lazyboy)는 귀하를 위해 인덱스 CFS를 유지 관리합니다. Cassandra 자체는 이것을 자동으로 수행하지 않습니다 (아직).

(2)는 (1)과 같지만 전체 FOO 객체를 인덱스 행의 하위 컬럼으로 복제합니다 (즉, 인덱스 최상위 열은 수퍼 컬럼입니다). 실제로 Foo ID 자체에 의해 쿼리되지 않는다면 자체 CF에 전혀 저장할 필요가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top