인덱스

  • 인덱스란, 데이터의 목차(색인)을 의미한다
    • 책 앞쪽이나 뒷쪽에 있는 색인과 같은 역할을 한다
  • 인덱스를 통해 데이터를 빠르게 검색할 수 있다
    • 인덱스 키를 기준으로 정렬되어 저장되어 있기 때문에 빠르게 검색이 가능하다
    • 인덱스가 없으면 Table Full Scan으로 검색시간이 오래걸린다
  • INSERT, UPDATE, DELETE (=Command)의 성능을 희생해 검색 성능을 향상 시킨다
    • 데이터 수정/삭제시 인덱스도 변경이 일어나기 때문
    • 수정/삭제를 위해 데이터를 찾는 과정에서는 인덱스를 활용할 수 있다
  • 인덱스는 추가적인 공간(DB의 약 10%)에 생성되기 때문에 비용이 든다

image

인덱스를 사용하면 좋은 경우

  • INSERT, UPDATE, DELETE가 빈번하지 않은 컬럼
  • JOIN, WHERE, ORDER BY, GROUP BY 등을 자주 사용 하는 컬럼
  • 카디널러티가 높은 컬럼(= 데이터 중복도가 낮은 경우)
    • 성별의 경우 선택지가 남/여 이기 때문에 카디널러티가 낮다

복합 인덱스

  • 복합 인덱스를 사용할 경우 먼저 잡힌 컬럼부터 인덱스를 타기 때문에 인덱스를 잡는 순서가 영향을 끼친다
  • 복합 인덱스를 잡을 때 카디널리티가 높은 컬럼 -> 낮은 컬럼(내림차순)으로 하는 것이 오름차순보다 성능이 더 좋다

  • 복합 인덱스 사용 시, 앞쪽에 잡힌 컬럼부터 타기 때문에 중간의 컬럼을 조건으로 한 쿼리는 인덱스를 타지 않는다
CREATE INDEX idx_salary ON salary(group_no, from_date, is_bonus); 

// 인덱스 사용 O
SELECT * FROM salary
WHERE group_no=1
AND from_date='2020-10-10'

// 인덱스 사용 X
SELECT * FROM salary
WHERE group_no=1
AND is_bonus=true;

SELECT * FROM salary
WHERE from_date='2020-10-10'
AND is_bonus=true;
  • 조회쿼리 작성 시 복합 인덱스로 잡은 컬럼 순서대로 하지 않아도 된다
    • 조회 조건에 포함 되는 지가 중요

인덱스 사용시 주의사항

  • between, like, >, < 등 범위 조건은 그 뒤 컬럼부터 인덱스를 사용하지 않는다
    • ex) where group_no=1 and is_bonus=true and from_date>'2020-10-10' 일 경우 is_bonus는 인덱스를 타지 않는다
  • in=을 여러번 한 것이기 때문에 인덱스를 사용한다

B-Tree