[데이터베이스] 인덱스(INDEX)

nayoon·2021년 6월 19일
0

computer

목록 보기
17/25

정의

테이블에 대한 동작의 속도를 높여주는 기술

목적

인덱스 사용 시 색인화된 인덱스 파일(따로 파일이 만들어짐)이 생성된다.

항상 정렬된 상태이기 때문에

1) 원하는 데이터를 찾기 위해 테이블을 검색하는 작업을 줄이거나 없앨 수 있다.

(기존 검색 방법을 테이블 스캔(Table Scan) 또는 풀 스캔(Full Scan)이라고 하는 데, 데이터가 많은 테이블에서 풀 스캔을 하면 처리 성능이 떨어진다.)

2) 색인화된 인덱스 파일 검색으로 검색 속도를 향상시킨다.

(색인화된 인덱스 파일을 위해 DB 내 별도의 공간이 필요한데 속도가 빨라지는 대신 사용되는 자원이라고 보면 된다.)

색인화

특정 내용이 들어 있는 정보를 쉽게 찾아볼 수 있도록

1) 표지 따위를 넣거나
2) 일정한 순서에 따라 배열한 것.

색인화된 인덱스 파일

B+tree 구조로 되어 있어 검색 속도가 향상되었다.

B+tree 인덱스는 원래의 값을 이용해서 인덱싱하는 알고리즘이다.
(원래는 컬럼의 값의 앞부분만 잘라서 관리하는 식으로 변형을 한다.)

Index 사용 방법

인덱스 생성

-- 인덱스 생성 (1)
create index 인덱스명 on 테이블명(컬럼명)

-- 인덱스 생성 (2)
alter table 테이블명 add index 인덱스명(컬럼명)

인덱스 조회

-- 인덱스 조회
show index 인덱스명 on 테이블명;

인덱스 삭제

-- 인덱스 삭제
alter table 테이블명 drop index 인덱스명;

Index 위치

테이블 생성 시, MYD, MYI, FRM 3개의 파일이 생성된다.

  • MYD
    실제 데이터가 있는 파일
  • MYI
    Index 정보가 들어가 있는 파일
  • FRM
    테이블 구조가 저장되어 있는 파일

Index를 사용하지 않는 경우 -> MYI 파일은 empty.

Select로 Index를 사용하는 Column 탐색 시 MYI 파일의 내용을 검색

MYI는 KEY-ROWID 로 구성되어 있다.
(key는 인덱스로 생성한 컬럼의 값, rowid는 해당 레코드가 저장된 주소)

인덱스가 생성된 컬럼을 조회하는 명령문이 입력되면 MYI 파일을 통해 컬럼을 찾고 레코드가 저장된 주소로 가기 때문에 조회 속도가 빠르다.

Index 동작

1) where절의 컬럼이 index가 존재하는 지 확인

2) index에 찾고자 하는 컬럼이 어떤 ROWID를 가지고 있는지 확인

3) 해당 ROWID에 있는 블록을 찾아가서 DB Buffer Cache에 복사

DML(INSERT, DELETE, UPDATE)

1) INSERT
새로운 데이터에 대한 인덱스 추가

2) DELETE
인덱스에 존재하는 값은 삭제하지 않고, 사용하지 않는다는 표시를 남김

3) UPDATE
이전 인덱스를 사용하지 않는다고 표시를 남기고, 갱신된 데이터에 대해 인덱스를 추가함.
UPDATE = DELETE + INSERT

Table Data 수와 Index Data 수가 다를 수 있다.

인덱스를 사용했을 때와 사용하지 않았을 때의 시간복잡도

Full Scan이나 Table Scan을 줄이거나 없앨 수 있다.

B+tree는 tree 구조로 시간복잡도는 O(logN)이다.

Full Scan은 모든 데이터를 다 뒤지기 때문에 시간복잡도는 O(N)이다.

인덱스 사용 시 좋은 경우

1) 데이터의 양이 많은 테이블

2) 변경이 자주 일어나지 않는 컬럼

3) Select과 Join이 많은 경우
외래키로 사용되는 Column이나 Join에 자주 사용되는 Column에 인덱스 사용 시 좋다.

인덱스 사용이 좋지 않은 경우

1) 테이블에 새로운 데이터를 추가하거나 갱신, 삭제가 자주 일어나는 경우

테이블에 데이터가 추가, 갱신, 삭제되면 인덱스에도 추가, 갱신이 되기 때문에 오버헤드가 발생할 수 있다.

참고 사이트

  1. Index

  2. 색인화

  3. [SQL] Index(인덱스)

  4. [DB] Index

profile
뚜벅뚜벅 열심히 공부하는 개발자

0개의 댓글