본문 바로가기

CS/데이터베이스

인덱스(index)?

  • 데이터 베이스에 데이터가 많으면 많을 수록 검색 성능을 향상시키는데 도움을 주는 기술이며,인덱스의 목적은 기초데이터 관리 시스템(RDMS row data mangement system)의 검색 속도를 높이는 데 있습니다.
  • SELECT 쿼리의 WHERE 절이나 JOIN 예약어를 사용했을 때 인덱스를 사용하여 쿼리의 검색 속도를 빠르게 하지만 insert, update, delete의 DML의 성능은 다소 떨어집니다.

 


인덱스의 동작 방식

인덱스가 동작하기 전 특정 컬럼명 인덱스를 설정했다고 가정합니다.

설정한 컬럼 명은 A라고 하고, 인덱스를 설정하면 A 컬럼에 대한 인덱스 테이블이 생성됩니다.
컬럼 A가 포함된 where절 쿼리를 요청하면 인덱스 테이블에서 값을 찾게 됩니다.
이 상황에서 동작은 다음과 같습니다.

1) 인덱스 테이블에서 where에 포함된 값을 검색
2) 해당 값의 테이블 아이디 PK를 획득
3) 가져온 테이블 아이디 PK값으로 원본 테이블에서 값을 조회

인덱스가 사용하는 알고리즘

B+tree 알고리즘

  • 리프노드(leaf nodes) : 실제 데이터가 저장된 노드
  • 논리프 노드(Non-leaf nodes) : 리프노드까지의 경로 역할을 하는 노드
  • 루트 노드(Root node) : 경로의 출발점 노드

B+tree는 리프노드에 이르기까지에 대한 자식 노드에 포인터가 저장되어 있기 때문에 B+트리의 검색은 루트노드에서 어떤 리프 노드에 이르는 한 개의 경로만 검색하면 되므로 매우 효율적이다.

왜 B+tree 사용을 할까요? 해시테이블이 더 괜찮은거 아닌가요?

SELECT 질의 조건에는 부등호 연산(<,>)도 포함되어 있어 해시 테이블은 동등 연산에 특화된 자료구조 이기 때문에 어울리지 않습니다.

인덱스 주의할 점

  • 인덱스는 따로 테이블의 형태로 관리가 됩니다. 이 뜻은 자원을 소모한다는 의미입니다. 이렇기에 무분별한 인덱스의 사용은 성능에 부정적인 영향을 주게 됩니다.

또한 인덱스는 이진트리를 사용하기 때문에 기본적으로 정렬되어 있습니다. 이로인해 검색과 조회의 속도를 향상시킬 수 있지만 잦은 데이터의 변경(삽입, 수정, 삭제)가 된다면 인덱스 테이블을 변경과 정렬에 드는 오버헤드 때문에 오히려 성능 저하가 일어날 수 있습니다.

위에서 말한 DML의 성능이 떨어집니다.

  • INSERT
    • 테이블에는 입력 순서대로 저장되지만, 인덱스 테이블에는 정렬하여 저장하기 때문에 성능 저하 발생
  • DELETE
    • 테이블에서만 삭제되고 인덱스 테이블에는 남아있어 쿼리 수행 속도 저하
  • UPDATE
    • 인덱스에는 UPDATE가 없기 때문에 DELETE, INSERT 두 작업 수행하여 부하 발생

예상 질문

인덱스에 대해서 설명해 주세요

데이터 베이스에 데이터가 많으면 많을 수록 검색 성능을 향상시키는데 도움을 주는 기술이며,
인덱스의 목적은 기초데이터 관리 시스템(RDMS row data mangement system)의 검색 속도를 높이는 데 있습니다

인덱스를 만들때 주의해야될 점이 있을까요?

인덱스는 이진 트리를 사용하기 때문에 기본적으로 정렬이 되어 있는 상태입니다.
이로인해 검색과 조회의 속도는 향상이 됩니다. 하지만 데이터의 변경이 되면 인덱스 테이블을 변경과 정렬에 드는 오버헤드 때문에 성능 저하가 발생하게 됩니다.