인덱스가 없는 컬럼에 대한 히스토그램 생성 및 관리
MySQL인덱스 및 통계명령어
ANALYZE TABLE shop.big UPDATE HISTOGRAM ON status WITH 64 BUCKETS;
-- 8.4+: histogram refreshed automatically as data changes
ANALYZE TABLE shop.big UPDATE HISTOGRAM ON status WITH 64 BUCKETS AUTO UPDATE;
SELECT SCHEMA_NAME, TABLE_NAME, COLUMN_NAME,
HISTOGRAM->>'$."histogram-type"' AS type,
JSON_LENGTH(HISTOGRAM->'$.buckets') AS buckets,
HISTOGRAM->>'$."last-updated"' AS last_updated,
HISTOGRAM->>'$."sampling-rate"' AS sampling_rate
FROM information_schema.COLUMN_STATISTICS;
ANALYZE TABLE shop.big DROP HISTOGRAM ON status;하는 일
컬럼의 값 분포(singleton 또는 equi-height)를 데이터 딕셔너리에 저장한다. 옵티마이저가 인덱스 없는 컬럼 필터의 선택도를 정확히 추정하여 조인 순서와 실행 계획 품질이 개선된다.
사용 시점
인덱스 추가가 바람직하지 않은 편향된 컬럼(예: status, type)에서 EXPLAIN ANALYZE가 추정 행 수와 실제 행 수의 큰 차이를 보일 때.
주의
인덱스가 있는 컬럼에서는 옵티마이저가 index dive를 사용하므로 히스토그램은 보통 효과가 없다(eq_range_index_dive_limit 초과 시 제외). 기본 MANUAL 모드에서는 데이터가 바뀌어도 히스토그램이 갱신되지 않으므로 ANALYZE ... UPDATE HISTOGRAM을 스케줄링한다. 큰 테이블은 histogram_generation_max_mem_size에 따라 샘플링된다(sampling-rate < 1). ANALYZE TABLE은 짧은 메타데이터 락을 잡으며, 히스토그램 갱신은 테이블 통계(인덱스 카디널리티)를 바꾸지 않는다.