MySQL ‐ Multi Column Index - woojin-playground/Backend-PlayGround GitHub Wiki
MySQL - Multi Column Index
복합 인덱스란?
- 복합 컬럼 인덱스는 데이터베이스에서 두 개 이상의 컬럼을 묶어서 생성하는 인덱스이다.
- 단일 인덱스만으로는 쿼리의 성능을 충분히 끌어올릴 수 없거나, 여러 컬럼을 동시에 조건으로 필터링하는 경우가 잦을 때 사용하는 강력한 성능 최적화 도구이다.
복합 인덱스 설계 시 핵심 고려사항
- 복합 인덱스를 생성할 때는 순서 배치가 생명이다.
- WHERE절에 자주 등장하는 컬럼을 앞을 : 쿼리의 조건절에 항상 혹은 가장 빈번하게 사용되는 컬럼이 앞으로 와야 한다.
- 동등 조건(=)을 앞쪽에 배치 : 범위 검색이 들어간 컬럼 뒤에 있는 컬럼들은 인덱스의 정렬 기능을 제대로 활용하지 못한다. 따라서
= 조건으로 검색되는 컬럼을 인덱스 앞쪽에 두는 것이 유리하다.
- 카디널리티(Cardinality) : 중복되는 값이 적은 컬럼을 앞쪽에 두는 것이 일반적으로 검색 대상을 빠르게 좁히는 데 도움이 된다.
트레이드오프
- 쓰기 성능 저하 : 테이블에
INSERT, UPDATE, DELETE가 발생할 때마다 복합 인덱스 트리도 함께 재정렬되어야 한다.
- 저장 공간 차지 : 인덱스도 데이터베이스의 메모리와 디스크 공간을 상당히 차지하는 별도의 자료구조라는 점을 인지해야 한다.
-- 주식 거래 이력 테이블 생성 예시
CREATE TABLE stock_trade_history (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
stock_code VARCHAR(20) NOT NULL, -- 종목코드
trade_date DATE NOT NULL, -- 거래일자
closing_price DECIMAL(10, 2), -- 종가
trade_volume BIGINT, -- 거래량
-- (stock_code, trade_date) 순서로 복합 인덱스 생성
INDEX idx_stock_trade (stock_code, trade_date)
);
-- (참고) 이미 만들어진 테이블에 나중에 인덱스를 추가할 때
-- CREATE INDEX idx_stock_trade ON stock_trade_history (stock_code, trade_date);