- minmax: 블록별로 표현식의 최소값과 최대값을 추적합니다. 느슨하게 정렬된 데이터에 대한 범위 쿼리에 적합합니다.
- set(N): 각 블록에 대해 지정된 크기 N까지의 값 집합을 추적합니다. 블록별 카디널리티가 낮은 컬럼에 효과적입니다.
- text: 토큰화된 문자열 데이터에 대해 역인덱스를 구축하여 효율적이고 결정적인 전문 검색을 가능하게 합니다. 근사적인 블룸 필터 기반 접근 방식 대신, 정확한 토큰 조회와 확장 가능한 다중 용어 검색이 필요한 자연어 또는 대규모 자유 형식 텍스트 컬럼에 권장됩니다.
- bloom_filter: 값이 블록 안에 존재하는지 확률적으로 판단하여 집합 포함 여부에 대한 빠른 근사 필터링을 가능하게 합니다. 일치 항목을 반드시 찾아야 하는 “건초 더미에서 바늘 찾기”와 같은 쿼리를 최적화하는 데 효과적입니다.
- tokenbf_v1 / ngrambf_v1: (Deprecated) 문자열에서 토큰 또는 문자 시퀀스를 검색하도록 설계된 특수 블룸 필터 변형으로, 특히 로그 데이터 또는 텍스트 검색 사용 사례에 유용합니다. ClickHouse 버전 >= 26.2에서는 text 인덱스를 대신 사용하도록 지원이 중단되었습니다.
- 전체적으로는 카디널리티가 높지만 블록 내에서는 카디널리티가 낮은 컬럼.
- 검색에 중요하지만 드물게 나타나는 값(예: 오류 코드, 특정 ID).
- 프라이머리 키가 아닌 컬럼에 대해 국소적인 분포를 보이는 데이터에서 필터링이 발생하는 경우.
- 실제 데이터와 현실적인 쿼리로 스킵 인덱스를 테스트하세요. 서로 다른 인덱스 유형과 세분화 수준 값을 시도하세요.
- send_logs_level=‘trace’ 및
EXPLAIN indexes=1같은 도구를 사용해 인덱스의 효과를 확인하고 영향을 평가하세요. - 항상 인덱스 크기와 세분화 수준이 이에 미치는 영향을 평가하세요. 세분화 수준 크기를 줄이면 더 많은 그래뉼을 필터링할 수 있어 일정 수준까지는 성능이 향상되는 경우가 많습니다. 그러나 세분화 수준이 낮아질수록 인덱스 크기도 커지므로 성능이 저하될 수도 있습니다. 다양한 세분화 수준 값에 대해 성능과 인덱스 크기를 측정하세요. 이는 특히 블룸 필터 인덱스에서 중요합니다.
예시
EXPLAIN indexes = 1 결과에서 확인할 수 있듯이, 대부분의 행은 여전히 읽어야 합니다.
ViewCount가 CreationDate(기본 키(primary key))와 연관되어 있음을 확인할 수 있습니다. 게시물이 오래 존재할수록 조회될 기회가 더 많아지기 때문입니다.
ALTER TABLE 명령으로 인덱스를 추가합니다. 먼저 추가한 다음 “materializing”합니다.
ViewCount 값과 최대 ViewCount 값을 기록합니다:
앞서 사용한 쿼리를 다시 실행하면 성능이 크게 향상된 것을 확인할 수 있습니다. 스캔된 행 수가 줄어든 점에 주목하십시오:
EXPLAIN indexes = 1을 사용하면 인덱스 사용 여부를 확인할 수 있습니다.
ViewCount > 10,000,000 프레디케이트와 일치할 수 없는 모든 행 블록을 minmax 스킵 인덱스가 어떻게 걸러내는지 보여주는 애니메이션도 확인할 수 있습니다: