인덱스(Index)란?

박춘화·2021년 9월 15일
0

MySQL을 기준으로 작성한 내용입니다!

인덱스가 뭐죠? 🙄

인덱스는 '데이터베이스에서 데이터를 빠르게 찾기 위한 도구'다. 인덱스를 생성하고, 인덱스를 사용하는 SQL문을 만들어 사용한다면 빠르게 응답을 받을 수 있으며, 서버에서도 적은 양의 일을 처리하게 되므로 전체 시스템의 성능이 향상되는 효과를 얻을 수 있다.
인덱스를 사용하여 얻을 수 있는 장·단점은 다음과 같다.

장점

  • 검색 속도가 향상된다. (단, 항상 그런 것은 아니다.)
  • 쿼리의 부하가 줄어들어 시스템 전체의 성능이 향상된다.

단점

  • 인덱스를 저장하기 위해 추가적인 데이터베이스 공간이 필요하다.
  • 인덱스를 생성하는데 많은 비용이 든다.
  • DB 변경 작업(Create, Update, Delete)이 자주 일어나는 경우에는 오히려 성능이 떨어질 수 있다.

그러므로 인덱스는 DB 변경 작업이 적고 검색 쿼리문(특히 SELECT)을 많이 사용하는 경우에 사용하는 것이 좋다.

인덱스의 종류 😮

MySQL에서 사용되는 인덱스의 종류는 크게 두 가지로 나누어지는데, 각각 클러스터형 인덱스Clustered Index와 보조형 인덱스Secondary Index다.(다른 DB에서는 보조형 인덱스를 비(非)클러스터형 인덱스라고도 한다.)

클러스터형 인덱스

  • 클러스터형 인덱스와 '기본 키(Primary Key) 인덱스'는 거의 동일한 용어처럼 사용된다.
    • 클러스터형 인덱스는 한 테이블에 한 개만 생성할 수 있는데, 기본 키 역시 테이블 당 하나만 생성할 수 있기 때문이다.
    • 그러므로 테이블 생성 시에 기본 키로 지정된 열이 존재한다면 그 열에 대한 클러스터형 인덱스가 생성된다.
  • 클러스터형 인덱스는 레코드의 순서를 인덱스로 지정한 열을 기준으로 자동 정렬한다.
  • 클러스터형 인덱스는 보조형 인덱스에 비해 검색 작업의 속도가 빠르다. 단, 입력/수정/삭제 작업은 느리다.

보조형 인덱스

  • 보조형 인덱스는 한 테이블에 여러 개 생성할 수 있다. 하지만, 보조형 인덱스를 많이 생성하면 오히려 시스템의 성능을 떨어트리므로 꼭 필요한 열에만 생성해야 한다.
  • 정렬 작업을 수행하지 않으므로 입력/수정/삭제 작업이 클러스터형 인덱스에 비해 더 빠르다.

B-tree(Balanced tree! not Binary tree!) 😣


출처 : https://ko.wikipedia.org/wiki/B_%ED%8A%B8%EB%A6%AC
B-tree는 Binary tree를 확장한 개념으로 하나의 부모 노드가 2개 이상의 자식 노드를 가지는 데이터 구조로, 대부분의 관계형 DBMS에서 인덱스를 생성하는데 사용한다.
MySQL에서 노드의 개념을 페이지라고 하는데, 페이지는 16KB 크기를 가지는 최소한의 저장 단위다. 그러므로 작은 데이터 하나를 저장하더라도 한 페이지를 모두 사용하게 된다.

페이지 분할 😐

B-tree를 인덱스를 생성하기 위한 데이터 구조로 사용함으로써 검색 작업의 속도가 빨라진다는 장점이 있는 반면, 입력/수정/삭제 작업의 속도는 느려진다는 단점이 있다고 앞에서 언급했었다. 특히 입력 작업 시에 속도가 매우 느려지는데, 이는 데이터를 입력하는 과정에서 현재 페이지의 공간을 모두 사용하면 새로운 페이지를 생성한 뒤에 새 페이지에 데이터를 입력하기 때문이다. 이러한 과정을 페이지 분할이라고 한다.

profile
함께 성장하는 개발자

0개의 댓글