보조 인덱스

보조 인덱스 (Secondary Indexes)

CQL은 테이블에 보조 인덱스를 만드는 것을 지원해서, 테이블에 대한 쿼리가 그 인덱스를 사용할 수 있게 해 줘요. 보조 인덱스는 다음과 같이 정의된 이름으로 식별돼요.

출처: Secondary Indexes

본문

index_name::= re('[a-zA-Z_0-9]+')

CREATE INDEX

CREATE INDEX 문은 주어진 (기존) 테이블의 주어진 (기존) 컬럼에 새 보조 인덱스를 만드는 데 사용돼요. 원하면 ON 키워드 앞에 인덱스 자체의 이름을 지정할 수 있어요.

create_index_statement::= CREATE [ CUSTOM ] INDEX [ IF NOT EXISTS ] [ index_name ]
	ON table_name '(' index_identifier ')'
	[ USING index_type [ WITH OPTIONS = map_literal ] ]
index_identifier::= column_name
	| ( KEYS | VALUES | ENTRIES | FULL ) '(' column_name ')'
index_type::= 'sai' | 'legacy_local_table' | fully_qualified_class_name

컬럼에 이미 데이터가 존재한다면 비동기적으로 인덱싱돼요. 인덱스가 생성된 후에는 컬럼에 대한 새 데이터가 삽입 시 자동으로 인덱싱돼요. 이미 존재하는 인덱스를 다시 만들려고 하면 IF NOT EXISTS 옵션을 사용하지 않는 한 오류가 반환돼요. IF NOT EXISTS를 사용하면 인덱스가 이미 존재할 때 해당 문은 no-op이 돼요.

예시:

CREATE INDEX userIndex ON NerdMovies (user);
CREATE INDEX ON Mutants (abilityId);
CREATE INDEX ON users (KEYS(favs));
CREATE INDEX ON users (age) USING 'sai';
CREATE CUSTOM INDEX ON users (email)
   USING 'path.to.the.IndexClass';
CREATE CUSTOM INDEX ON users (email)
   USING 'path.to.the.IndexClass'
   WITH OPTIONS = {'storage': '/mnt/ssd/indexes/'};

인덱스 타입 (Index Types)

USING 키워드는 선택적으로 인덱스 타입을 지정해요. 두 가지 내장 타입이 있어요.

  • legacy_local_table — (기본값) 숨겨진 로컬 테이블로 구현된 레거시 보조 인덱스.
  • sai — 최적화된 SSTable/Memtable 부착 인덱스로 구현된 "storage-attached" 인덱스.

커스텀 인덱스를 만들려면 완전히 정규화된 클래스 이름을 지정해야 해요.

맵 키에 대한 인덱스 (Indexes on Map Keys)

maps에 인덱스를 만들 때는 키 또는 값을 인덱싱할 수 있어요. 컬럼 식별자가 keys() 함수 안에 배치되면 인덱스는 맵 키에 대한 것이 돼서 WHERE 절에서 CONTAINS KEY를 사용할 수 있어요. 그렇지 않으면 인덱스는 맵 값에 대한 것이 돼요.

DROP INDEX

보조 인덱스를 제거할 때는 DROP INDEX 문을 사용해요.

drop_index_statement::= DROP INDEX [ IF EXISTS ] index_name

DROP INDEX 문은 기존 보조 인덱스를 제거하는 데 사용돼요. 문의 인자는 인덱스 이름이며, 선택적으로 인덱스의 키스페이스를 지정할 수 있어요.

인덱스가 존재하지 않으면, IF EXISTS를 사용하지 않는 한 오류가 반환돼요. IF EXISTS를 사용하면 그 연산은 no-op이 돼요.

더 알아보기 (Learn more)