Post

Index

Index

개요

우리말로하면 색인 정도 된다.
사실상 Database의 성능을 결정짓는 가장 중요한 부분이라고 할 수 있다.
이 색인은 기본적으로 데이터가 어디에 저장되어있는지 위치를 알고 있는 주소록이다.
가령 우리가 어떤 기술서를 읽는다고 가정했을 때 대부분의 기술서 제일 뒤편에는 색인이 있다.
어떤 특정 키워드를 찾고 싶다면 가장 앞에 있는 목차를 봐도 좋지만 가나다라 순으로 정리되어있는 색인에서 키워드를 찾아서 위치를 찾아간다면 더욱 빠르다. 물론 색인에 해당 키워드가 있어야 겠지만 말이다.

Index 작동 원리

먼저 인덱스의 작동 원리에 대해서 알기 위해서는 Index가 어떤 구조인지 알아야 한다. 가령 아래의 Table이 있다고 가정해보자.

STUDENT_IDNAME
2022070101JOHN
2022070102DAVE
2022070103JAKE
2022070104ASKA
2022070105DOLA
2022070106SARA

위 Table에서 STUDENT_ID가 2022070103인 사람을 찾는다고 해보자.
예시에서야 레코드 개수가 몇개 안되니 전체를 훑는 게 좀 더 빠르고 편할 수 도있지만 레코드 개수가 10만개를 넘어간다고하면 눈 앞이 깜깜해질 수 밖에 없다.

만약에 Index가 없다면 어떤 데이터를 찾을 때 테이블 전체의 데이터를 찾을 수 밖에 없다. 이를 Full scan이라고 하는데, 데이터가 작다면 문제가 안되겠지만 이 데이터가 몇만, 몇백만, 몇천만이 될 경우 당연스럽게도 데이터를 찾는 속도는 점점 느려질 수 밖에 없다.

하지만 STUDENT_ID에 대해서 별도의 옵션없이 INDEX를 건다면 아래와 같이 B-TREE로 Index가 만들어진다.

img.png

위의 그림에서는 STUDENT_ID로만 B-TREE가 이루어져있지만 정확하게는 다음의 key와 해당 key로 찾아갈 수 있는 주소인 RowID로 구성되어있다.
원하는 값을 찾고 RowId로 실제 데이터로 엑세스하는 식인 것이다.

Index 생성 방법

총 두 가지 방법이 있다.

자동 생성

Table 생성시에 primary 키로 지정한 속성이나 UNIQUE 제한 규칙을 지정한 값에 대해서는 자동으로 Index가 생성된다.

수동 생성

CREATE INDEX 명령으로 직접 생성하는 Index이다. 아래와 같이 형태로 생성한다.

1
2
3
CREATE INDEX index_name ON table(column1,column2)
-- index_name은 생성한 인덱스의 이름 table은 지정하고하는 테이블의 이름
-- column1,2는 지정하고자하는 column 값이며 더 늘어날수 있음

Index 사용시 주의 사항

1. CREATE, UPDATE, DELETE가 많은 TABLE에서 사용을 고민해볼 것

Index는 Read의 경우 매우 빠른 성능을 보장한다. 다음의 경우 성능이 느려진다.

  • CREATE : TABLE 뿐만 아니라 INDEX에도 값을 추가 하기 때문에 성능이 느려진다.
  • DELETE : 실제로 삭제하지는 않고 사용하지 않는 표기만 한다. (HASHING에 Tombstone같이) 따라서 많아지면 Read에도 느려진다.
  • UPDATE : INDEX에 UPDATE하는게 아닌 기존 데이터를 DELETE한 후 INSERT하는식으로 처리한다. 따라서 느리다.

2. 쿼리에서 사용시 Index를 포함할 것

당연 하지만 Index를 만들어 놓고 해당 쿼리에 INDEX를 사용하지 않는다면 성능 향상이고 뭐고 없다

3. 구별되는 값이 많은 Column

유일성이 높거나 넓은 값을 가진 컬럼을 지정하는것이 좋다. 그리고 NULL 값이 들어있으면 인덱스에는 해당 레코드가 INDEX에 포함되지 않는다.

4. 일정 이상의 레코드 수가 있는 TABLE에 사용할 것

너무 수가 적으면 그냥 TABLE 전체를 찾는게 더 빠를 수 있다.

5. 큰 데이터 중에 작은 데이터 값을 찾을 경우 사용하면 좋음

일반적으로 테이블의 15% 이하 정도의 양의 데이터를 찾을 때 인덱스를 쓰면 좋다.

참고자료

This post is licensed under CC BY 4.0 by the author.