[데이터베이스] 인덱스

Yoon Uk·2023년 8월 9일
0

데이터베이스

목록 보기
12/20
post-thumbnail

인덱스란?

데이터베이스에서 인덱스란 테이블의 컬럼을 기준으로 데이터를 빠르게 검색할 수 있도록 도와주는 자료구조입니다. 인덱스를 사용하면 테이블의 전체 데이터를 스캔하지 않고도 원하는 데이터를 찾을 수 있습니다.
인덱스는 키-값 쌍으로 구성되며, 키는 인덱스를 구성하는 컬럼의 값이고, 값은 해당 키를 가진 레코드의 주소입니다.

인덱스의 장점

인덱스의 장점은 검색 속도가 향상된다는 것입니다. 인덱스는 일반적으로 B-트리나 해시 테이블과 같은 효율적인 자료구조로 구현되기 때문에, 키 값을 기준으로 데이터를 빠르게 탐색할 수 있습니다.
예를 들어, 이름으로 사원 정보를 검색하는 경우, 인덱스가 없다면 테이블의 모든 레코드를 순차적으로 비교해야 하지만, 인덱스가 있다면 이름을 키로 가지는 레코드의 주소를 바로 찾을 수 있습니다.

인덱스의 단점

인덱스의 단점은 삽입, 삭제, 수정 작업이 느려진다는 것입니다.
인덱스가 있는 테이블에 데이터를 추가하거나 변경하면, 인덱스도 함께 업데이트해야 합니다. 이 과정에서 인덱스의 구조가 변경되거나 재구성되어야 할 수도 있습니다.
예를 들어, B-트리 인덱스에서 노드의 분할이나 병합이 발생할 수 있습니다. 따라서, 인덱스는 검색이 빈번하고 삽입, 삭제, 수정이 적은 테이블에 적합합니다.

인덱스의 역할별 구분

프라이머리 키(Primary Key, 기본 키)

레코드를 대표하는 칼럼의 값으로 만들어진 인덱스입니다.
테이블에서 해당 레코드를 식별할 수 있는 기준값이 됩니다.
프라이머리 키는 NULL 값을 허용하지 않으며 중복을 허용하지 않는다는 특징을 가지고 있습니다.

보조 키(Secondary Key)

프라이머리 키를 제외한 나머지 모든 인덱스입니다.
유니크 인덱스는 프라이머리 키와 성격이 비슷하고 프라이머리 키를 대체해서 사용할 수 있다고 해서 대체 키 라고도 하는데 이를 세컨더리 인덱스로 분류하기도 합니다.

인덱스의 종류

Clustered Index

  • 테이블당 1개만 존재할 수 있습니다.
  • 기본 키(Primary Key)로 지정된 컬럼은 자동으로 클러스터링 인덱스가 생성됩니다.
  • NOT NULL과 UNIQUE 제약 조건을 동시에 칼럼에 걸면 클러스터링 인덱스로 사용할 수 있습니다.
  • 실제 저장된 데이터와 같은 그룹의 페이지 구조를 가집니다.
    • 위의 이미지에서 페이지의 크기는 100입니다.
  • 클러스터링 인덱스를 기준으로 데이터가 자동 정렬됩니다.
    • 기본 키를 변경하면 클러스터링 인덱스가 변경되기 때문에 변경된 기본 키를 기준으로 자동 정렬됩니다.

Non-Clustered Index

  • 한 테이블에 여러개 설정 가능합니다.
  • UNIQUE 키워드로 고유 컬럼 지정 시 자동으로 보조 인덱스가 생성됩니다.
  • 실제 저장된 데이터와 다른 그룹의 별도의 페이지 구조를 가집니다.
  • 클러스터링 인덱스와 달리 데이터를 정렬하지 않습니다.
  • CREATE INDEX 문으로 직접 보조 인덱스 생성이 가능합니다.
  • 각 Pointer는 실제 데이터의 Clustered Index(Primary Key)를 나타냅니다.
    • 만약 Pointer가 데이터의 주소를 저장한다면 데이터가 삭제되는 등의 수정이 일어난 뒤 인덱스 페이지에 변화가 생겼을 때 주소를 저장하고 있던 Pointer의 값도 함께 변경해줘야 하는 번거로운 작업이 추가되게 됩니다.

인덱스 설정 기준

인덱스는 데이터의 검색 효율을 높여줍니다. 하지만 무분별한 인덱스 설정은 저장 공간 낭비 등 비효율을 낳을 수 있습니다.

효율적인 인덱스를 설정하는 기준은 다음과 같습니다.

  • 자주 검색되는 컬럼에 인덱스를 설정합니다.
    예를 들어, 사용자의 아이디나 이메일과 같은 컬럼은 인덱스를 설정하는 것이 좋습니다.

  • 검색 조건에 사용되는 컬럼에 인덱스를 설정합니다.
    예를 들어, 날짜나 가격과 같은 범위 검색이 자주 이루어지는 컬럼은 인덱스를 설정하는 것이 좋습니다.

  • 카디널리티가 높은 컬럼이 인덱스 설정에 좋습니다.
    어떤 컬럼의 카디널리티가 높다는 뜻은 중복도가 낮다는 의미입니다. 이는 값들이 대부분 다른 값을 가진다는 뜻입니다.
    이를 통해 불필요한 데이터의 대부분을 걸러낼 수 있습니다.

  • 조인에 사용되는 컬럼에 인덱스를 설정합니다.
    예를 들어, 외래키로 연결된 테이블의 컬럼은 인덱스를 설정하는 것이 좋습니다.

  • 업데이트나 삭제가 자주 일어나지 않는 컬럼에 인덱스를 설정합니다.
    예를 들어, 주소나 전화번호와 같은 컬럼은 인덱스를 설정하기보다는 다른 방법으로 최적화하는 것이 좋습니다.

인덱스 사용 시 주의점

인덱스를 설정하는 것은 데이터베이스의 성능을 향상시킬 수 있지만, 잘못 설정하면 오히려 성능을 저하시킬 수 있습니다. 따라서 인덱스를 설정할 때는 다음과 같은 점들을 고려해야 합니다.

  • 인덱스는 모든 컬럼에 적용할 필요가 없습니다.
    검색에 자주 사용되는 컬럼이나 조건절에 사용되는 컬럼에만 인덱스를 생성하는 것이 좋습니다.
    WHERE 조건절에 사용되는 칼럼이라고 해서 전부 인덱스로 생성하면 데이터 저장 성능이 떨어지고 인덱스의 크기가 비대해져 역효과를 불러올 수 있습니다.

  • 인덱스는 컬럼의 카디널리티가 높을수록 유리합니다.
    카디널리티란 컬럼의 값이 얼마나 다양한지를 나타내는 지표입니다. 카디널리티가 낮은 컬럼은 인덱스를 사용해도 검색 효율이 크게 개선되지 않습니다.

  • 인덱스는 공간을 차지합니다.
    인덱스는 테이블과 별도로 저장되기 때문에, 디스크 공간을 추가로 사용합니다.
    인덱스를 너무 많이 만들면 데이터베이스의 용량이 증가하고, 백업이나 복구 시간이 길어질 수 있습니다.
    따라서, 필요한 만큼만 인덱스를 생성하는 것이 중요합니다.

  • 인덱스는 유지비용이 듭니다. 데이터가 삽입, 수정, 삭제될 때마다 인덱스도 함께 갱신되어야 합니다. 이 과정에서 성능 저하가 발생할 수 있습니다.

  • 인덱스는 적절한 순서로 정렬되어야 합니다. 인덱스의 정렬 순서가 검색 조건과 일치하지 않으면 인덱스의 효율이 떨어질 수 있습니다.

마무리

인덱스는 데이터베이스의 성능을 향상시키는 강력한 도구입니다. 하지만, 잘못 사용하면 오히려 역효과를 낼 수도 있습니다. 따라서, 인덱스의 원리와 장단점을 이해하고 적절하게 활용하는 것이 중요합니다.

참고

Real MySQL 8.0(백은빈, 이성욱 지음)
[10분 테코톡] 라라, 제로의 데이터베이스 인덱스
geeksforgeeks.org

0개의 댓글