코드로 우주평화

데이터베이스에서 인덱스는 왜 사용하는 걸까? 본문

나는 이렇게 학습한다/DB

데이터베이스에서 인덱스는 왜 사용하는 걸까?

daco2020 2022. 3. 19. 16:01

인덱스란?

인덱스는 데이터베이스에서 테이블의 검색 성능을 높여주는 방법입니다.

관계형 데이터베이스에서는 B+Tree구조로 된 index를 사용하여 검색 속도를 향상시킵니다.

특히 select ~ where 쿼리처럼 특정 데이터를 찾을 때 빠른 속도로 검색할 수 있게 해 줍니다.

 

 

인덱스의 구조

인덱스는 Btree, B+tree(대부분), Hash, Bitmap로 구현할 수 있습니다.

인덱스를 생성하면 특정 컬럼(속성)의 값을 기준으로 정렬하여 데이터의 물리적 위치 주소와 함께 별도 파일에 저장합니다.

이때 특정 컬럼을 'search-key'라고 하고 실제 데이터의 물리적 위치 값을 'pointer'라고 합니다.

보통 인덱스는 테이블 크기의 10% 정도의 저장 공간을 차지합니다.

 

 

인덱스를 사용하는 이유

테이블의 데이터는 순서 없이 쌓이게 되므로 특정 조건의 데이터를 찾으려면 테이블의 모든 데이터에 접근하여 비교하는 과정이 필요합니다.(full table scan) 하지만 인덱스가 있는 경우 search-key가 정렬되어 있기 때문에 조건 검색 시 속도가 빠릅니다.

 

만약 대량의 데이터를 가지고 있고 select ~ where 같은 특정 조건의 데이터를 찾을 때, 인덱스를 활용하여 빠르게 데이터를 가져올 수 있습니다. 반대로 데이터의 양이 많지 않다면 굳이 인덱스를 사용할 이유가 없어집니다.

 

 

 

'클러스터형 인덱스'와 '보조 인덱스'

Clustering index : 특정 컬럼을 기본키로 지정하면 자동으로 인덱스가 생성되고 테이블 자체가 정렬된 인덱스가 됩니다. (컬럼을 기본키로 지정하면 테이블이 기본키를 정렬함)

Secondary index : 별도의 공간에 인덱스를 생성합니다. (create index 혹은 고유키를 지정하면 생성)

 

 

인덱스의 장단점

인덱스의 장점은 빠른 검색 속도 향상입니다.

인덱스의 단점은 추가 저장공간이 필요하다는 점입니다.(약 10%)

그리고 insert, update, delete 등의 변동 사항이 있는 경우 성능이 저하됩니다.

왜냐하면 데이터 변경 시 인덱스도 수정되어 추가 비용이 발생하기 때문입니다.

 

 

 

 

그렇다면 인덱스를 어느 컬럼에 사용하는 것이 좋을까?

인덱스는 where 절에서 ‘자주 조회’하고 ‘수정 빈도’가 낮으며 ‘데이터 중복’이 적은 컬럼을 선택하는 것이 좋습니다.

join 조건으로 자주 사용되는 컬럼도 인덱스로 사용하면 좋습니다.

데이터의 양이 많을수록 인덱스 성능 향상이 커집니다.

 

단, 한 테이블에 인덱스가 너무 많으면 데이터 수정 시 소요시간이 커집니다. 

또한 성별처럼 데이터 중복이 높은 값은 인덱스를 생성하지 않는 것이 크게 의미가 없습니다.

왜냐하면 인덱스의 이점보다 추가 저장공간이나 데이터 수정에 대한 성능 저하가 더 크기 때문입니다.