[DB] INDEX - 무조건 다 좋은게 아니다.

·2024년 1월 10일
0

Database

목록 보기
2/2
post-thumbnail

INDEX

데이터를 특정 기준으로 정렬하여 검색 속도를 향상시키는데 사용되는 데이터 구조이다.

INDEX는 특정 열(칼럼)의 데이터 값과 해당 데이터가 저장된 레코드(행)의 위치를 연결하는 데이터 구조로, 데이터 베이스 검색 및 질의 성능을 향상시키는데 중요한 역할을 한다. INDEX를 사용하지 않는 컬럼의 경우, 데이터베이스 전체를 탐색하는 FULL SCAN을 수행하게 된다.

더불어 INDEX 를 적용했다 하더라도, 조건절이 따로 존재하지 않거나, INDEX 의 처리 범위가 너무 크거나, 크기가 작은 테이블의 경우에는 FULL SCAN 이 이루어진다.

장점

  • 조회 속도를 높일 수 있다.
  • 전반적인 시스템 부하를 줄인다.

단점

  • 데이터 변경(추가, 수정, 삭제 연산) 시, 인덱스에도 변경이 일어나며 추가적인 오버헤드가 발생한다. (쓰기 성능의 감소, DML에 취약)
  • 인덱스를 구성하기 위한 추가적인 저장 공간이 필요하다. (대체적으로 원본 테이블의 10~20%의 추가적인 자원이 필요)


인덱스를 사용하면 좋은 예

WHERE 절 효율성

일반적으로 테이블안에 데이터를 저장하는 경우, 레코드는 내부 순서가 없이 뒤죽박죽 저장이 되며, 조건 절에 해당하는 데이터를 찾고자 FULL SCAN을 진행한다.

INDEX를 사용하면, INDEX 설계 시 구성한 기준을 가지고 항시 최신 정렬상태를 유지하기 때문에, 보다 빠른 조회가 가능해진다.

ORDER BY 절의 효율성

ORDER BY 는 굉장히 부하가 많이 걸리는 작업이다. 기본적으로 ORDER BY 를 수행하는 경우 전체 데이터를 메모리에 할당하여 정렬을 이루며, 데이터 양이 큰 경우에는 추가적인 I/O 작업이 이루어지기도 한다. INDEX를 사용하면, 이미 정렬이 되어 있어, 이러한 자원 소모를 줄일 수 있다.

MIN, MAX의 효율성

레코드의 시작과 끝값만 가져오기 때문에, 테이블 전체를 탐색하여 MIN,MAX 값을 찾는 것 보다 훨씬 효율적으로 찾을 수 있다.



인덱스 주의사항

규모가 작은 테이블은 사용 X

규모가 작은 테이블의 경우에는 INDEX 를 적용시킨다 하더라도, FULL SCAN 과의 성능 차이가 미비할 가능성이 높다.

오히려 해당 테이블에 대한 추가적인 공간과 데이터 변경 시의 INDEX 도 함께 변경되어야 하는 오버헤드 때문에, INDEX 를 사용하는 것이 성능저하를 가져올 가능성이 크다.

변경사항이 많은 컬럼의 경우

INDEX 는 데이터 변경 시 INDEX 의 정렬 상태도 함께 변경되는 추가적인 오버헤드가 발생한다. 만약 운영하는 서비스에 대하여 해당 컬럼에 INDEX 를 사용하여 얻는 조회의 이점보다, 쓰기 시의 성능저하의 단점이 더 큰 경우에는 INDEX 를 적용시키지 않는 것이 좋다.

중복도가 낮은 컬럼에 INDEX를 적용하자.

중복도가 컬럼의 경우, INDEX 를 적용하여도 조건에 일치하는 데이터가 늘어나게 된다. 따라서 컬럼 자체의 고유성을 띄고 있는 컬럼을 기준으로 INDEX 를 적용시키는 것이 효율성이 높아진다.

PRIMARY KEY, UNIQUE

데이터베이스에 따라 다르지만, 데이터 식별자를 위한 PRIMARY KEY 나 데이터의 제약조건을 위한 UNIQUE 를 사용하는 경우, 자동으로 해당 컬럼에 관련된 INDEX 를 자동 생성하여, 조회의 이점을 제공한다.




참고
10분 테코톡 - 라라, 제로의 데이터베이스 인덱스
인덱스 (클러스터, 비클러스터)

profile
새로운 것에 관심이 많고, 프로젝트 설계 및 최적화를 좋아합니다.

0개의 댓글