Developing Myself Everyday
article thumbnail

인덱스란?


데이터베이스 인덱스는 데이터베이스의 효율적인 검색 및 데이터 접근을 지원하기 위해 사용되는 자료 구조다. 인덱스는 테이블의 컬럼 또는 컬럼의 조합에 대한 정렬된 데이터 구조로, 검색 속도를 향상시키고 데이터 접근 시간을 줄여준다.

 

인덱스는 데이터를 빠르게 찾을 수 있는 하나의 장치라고 볼 수 있다. 즉 메모리 영역의 일종의 목차를 생성하는 개념이다.

 

 

B - Tree

인덱스는 보통 B - Tree라는 자료 구조로 이루어져 있다.

 

 

B - Tree는 루트 노드, 리프 노드 그리고 루트 노드와 리프 노드 사이에 있는 브랜치 노드로 나뉜다.

 

트리 탐색은 맨 위 루트 노드부터 탐색이 일어나며 브랜치 노드를 거쳐 리프 노드까지 내려온다. 위의 그림처럼 이렇게 루트 노드부터 시작하여 마지막 리프 노드에 도달해서 결과값을 반환하게 된다.

 

 

MySQL에서의 인덱스

MySQL에서의 인덱스는 MySQL Index 파일에 저장된다. 다만 조회속도는 빨라지지만 UPDATE, INSERT, DELETE 시의 속도는 저하된다는 단점이 있다.

 

-- 단일 인덱스
CREATE INDEX 인덱스이름 ON 테이블이름(필드이름1)

-- 다중 컬럼 인덱스
CREATE INDEX 인덱스이름 ON 테이블이름(필드이름1, 필드이름2, ...)

 

인덱스를 생성하는 방법은 위와 같다.

 

 

 

 

인덱스 최적화 기법

1) 인덱스는 두 번 탐색하도록 강요한다. 인덱스 리스트, 컬렉션 순으로 탐색하기 때문에 관련 읽기 비용이 들게 된다. 또한, 컬렉션이 수정되었을 때 인덱스도 수정되어야 한다. 이 때 B - Tree의 높이를 균형있게 조절하는 비용과 분산시키는 비용이 들게 된다. 그렇기 때문에 쿼리에 있는 필드에 인덱스를 무작정 다 설정하는 것은 답이 아니다. 컬렉션에서 가져와야 하는 양이 많을수록 인덱스를 사용하는 것은 비효율적이다.

 

2) 보통 여러 필드를 기반으로 조회할 때 인덱스를 생성하는데, 인덱스를 생성하는 순서가 있고 그 순서에 따라 성능이 달라지게 된다. 그 기준은 다음과 같다

  •  같음을 비교하는 쿼리가 있다면 제일 먼저 인덱스로 설정한다.
  • 정렬에 쓰는 필드라면 그 다음 인덱스로 설정한다
  • 다중 값을 출력해야하는 필드라면 나중에 인덱스를 설정한다.
  • 값이 유니크한 필드에 인덱스를 먼저 생성한다.

 

 

인덱스의 장단점

장점 단점
  • 데이터베이스가 더 빠르게 데이터를 검색할 수 있다.
  • 데이터를 정렬하거나 그룹화하는 데에도 도움을 준다. 
  • 데이터베이스의 데이터 무결성을 유지하는데 도움을 준다
  • 데이터베이스의 추가적인 디스트 공간을 차지한다.
  • 데이터베이스에 삽입, 갱신 또는 삭제 작업을 수행할 때마다 해당 인덱스를 업데이트 해야한다. 이런 작업은 추가적인 오버헤드를 발생시키며, 데이터의 일관성을 유지하기 위해 인덱스르 업데이트해야 한다. 
  • 인덱스를 잘못 선택하거나 유지 관리하지 않으면 오히려 성능 저하를 초래할 수 있다.

 

요약하면, 인덱스는 데이터베이스의 검색 및 정렬 성능을 향상시키는 데 도움을 주지만, 추가적인 디스크 공간을 요구하고 데이터 변경 작업에 대한 오버헤드가 발생할 수 있다. 따라서 인덱스를 사용할 때는 상황에 맞게 최적화하고 관리해야 한다.

profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!