📌 Index 이론

  • 테이블의 데이터 조회 시 동작속도를 높여주는 자료구조
  • 테이블 내 1개의 컬럼 혹은 여러개의 컬럼을 이용하여 생성
  • 순서 매김 동작에 대한 기초를 제공
  • 인덱스는 key-value의 형태의 파일로 하드 디스크 공간에 저장됨
  • 인덱스를 저장하는 데 필요한 디스크 공간은 테이블을 저장하는데 필요한 디스크 공간보다 작음
  • 인덱스는 테이블 부분에 대한 하나의 사본
    • index로 생성한 컬럼을 이진트리처럼 비트리 형태으로 탐색한다.
  • 고유 제약 조건을 실현하기 위해 사용됨

    제약조건을 걸면 인덱스가 만들어지고 디스크 공간을 차지하기 때문에
    인데스를 너무 난발하면 안된다.

Index의 문제점

  • 필요없는 인덱스를 만들면 데이터베이스가 차지하는 공간만 늘어나고 index를 이용하여 데이터를 찾는 것이 전체 테이블을 찾는 것보다 느려질 수 있다.
  • DB 크기의 10%정도의 추가 공간이 필요하다.
  • 처음 index를 생성하는데 많은 시간이 소요된다.
    • 데이터가 있는 테이블에 index를 만들면 데이터 재정렬이 일어나기 때문이다.
  • 데이터 변경 작업이 자주 일어나는 경우 index를 계속 갱신해야 함으로 오히려 성능 저하가 일어날 수 있다.

Index 종류

클러스터형 인덱스 (Clustered Index)

  • 검색 속도 lonN
  • 특정 나열된 데이터들을 일정 기준으로 정렬해주는 인덱스
    • 즉, 데이터 자체를 정렬화한다 (ex 영어사전)
    • MySQL에서는 테이블 그 자체로 봐도 된다.
  • 클러스터형 인덱스 생성 시 데이터 페이지 전체가 다시 정렬 -> 이미 대용량의 데이터가 입력된 상태면 클러스트형 인덱스 생성시 심각한 부가 발생
  • 테이블 당 하나만 생성 가능,
  • 보조 인덱스보다 검색속도가 더 빠르고 단, 입력/수정/삭제는 더 느리다.

넌 클러스터형 인덱스 (Non-Clustered Index) = 보조 인덱스 (Secondary Index)

  • 검색 속도 2lonN
  • 후보키에만 부여가능한 index
  • 데이터 자체가 재정렬되지 않고 데이터 페이지는 그냥 둔 상태에서 별도의 페이지에 인덱스를 구성한다. (ex 책의 색인)

제약조건에 따른 Index 결정

  • PK가 존재하면서 Unique가 존재하면
    PK - clustered Index / Unique - Non-Clustered Index
  • PK가 존재하지 않고 Unique가 존재할 때
    Unique가 Not Null - clustered Index
    Unique가 Null을 허용 - Non-Clustered Index

Index 생성 전략

  • index는 열 단위에 생성
  • where절에서 자주 사용되는 열에 생성
  • 데이터 중복도가 낮은 열에 생성
  • 조인에 자주 사용되는 열에 index를 사용하는 것이 좋음
  • 사용하지 않는 index는 제거하기
  • 외래키를 설정한 열에는 자동으로 외래키 index가 생성됨

Index 실습 in MySQL

Index 생성

  • create index로 만들면 Non-Clustered Index로 만들어진다.

Index 설정

  • 중복된 값이 있는 컬럼의 index를 만들 때
create index db_address_area_idx 
on ssafy (address_area);
  • unique 컬럼의 index를 만들 때
create unique index db_birth_year_idx  
on ssafy (birth_year);

Table의 Index 보기

show index from table;

Cost 비교

mysql 옵티마이저가 조회문에 따른 최적의 실행계획을 세우게 됩니다 그때 설정된 중 최적의 인덱스를 사용하게 됩니다 이때 옵티마이저는 cost base 방식으로 실행계획을 설정하게 됩니다 oracle 의 경우는 사용자가 사용 인덱스를 선택할수도 있습니다

제약조건
Primary key : user_id
Unique : address_area
Unique : user_name
Not Unique : birth_year

table의 index 보기
non_unique의 값

  • 0: Unique / 1: Not Unique

0개의 댓글

Powered by GraphCDN, the GraphQL CDN