로직과의 사투/DB

쿼리튜닝 겉핥기 - 인덱스란?

지난 번 옵티마이저에 대해 알아본 것에 이어 이번엔 DBMS의 인덱스를 정리하고자 한다.

1. 인덱스(Index) 란?

인덱스는 DBMS에서 조회 성능을 높이기 위한 기술이다. 데이터베이스에서 인덱스는 조회 성능을 높이기 위해서뿐만아니라 유니크나 프라이머리 키 제약과 같은 제약 조건을 구현하기 위해서도 사용된다. 그렇기 때문에 인덱스에 대한 이해를 빼고선 데이터를 잘 다룰 수 없다.

2. 인덱스의 저장 구조 및 관리

인덱스 또한 데이터이므로 별도의 인덱스 페이지로 관리된다. 인덱스 페이지는 B-Tree로 관리된다. B-Tree는 따로 더 공부가 필요한 부분이라 자세한 사항은 나중을 기약하기로 하고, 간단하게만 보자면 B-Tree는 기본이 되는 루트 노드를 중심으로 노드들이 하위로 연결되어 있으며, 어떤 노드에 대한 탐색 횟수도 동일한 균형 탐색 구조를 가진다는 특징 때문에 빠른 검색을 요하는 경우에 적합하다.

3. 인덱스의 종류

인덱스는 크게 클러스터드 인덱스(Clustered Index)와 넌 클러스터드 인덱스(Non-Clustered Index)로 나눌 수 있다. 클러스터드 인덱스는 테이블 당 오직 하나만 생성할 수 있고, 넌 클러스터드 인덱스는 여러 개를 생성할 수 있다. 클러스터드 인덱스는 키로 설정된 컬럼을 B-Tree 형식으로 정렬해놓는데, Leaf Level(리프 노드 : 가장 마지막에 위치한 노드들)에서 아예 데이터 페이지 자체를 정렬해둔다. 그러므로 데이터 페이지 자체를 정렬하는 클러스터드 인덱스는 더 이상 추가가 불가능하다.

* In MySQL : PK에 대해 클러스터드 인덱스를 생성한다. 만약 PK를 Define하지 않았다면 UNIQUE한 NOT NULL Field를 이용해 클러스터드 인덱스를 생성한다. PK도 선언하지 않았고, Unique Not Null컬럼이 없다면 내부적으로 6-byte 크기의 필드를 생성하여 사용하게 된다.

4. Balanced Search

인덱스의 여러 특징 중 가장 간단한 말은 균등 탐색이다. DB에서 인덱스를 사용하는 이유는 특정 값을 접근하는 데에 거의 동일한 비용이 들어간다는 가정에서 모든 것이 출발한다. 인덱스를 사용하는 경우 균등한 탐색 비용이 소모되기 때문에, 데이터가 아무리 많이 쌓인다 하더라도 조회 시간은 거의 동일하다. 

5. 인덱스의 적절한 사용

기본적으로 좋은 인덱스들을 설정했다면 쿼리 성능은 뛰어난 편일 것이다. 그러나 쿼리 성능이 나쁜 이유는 무엇일까? 그 이유는 대부분 인덱스를 사용할 수 있도록 고려된 조건 설정이 잘못되었거나 효율적이지 못한 경우이다. 그렇기 때문에 다음 포스팅에서 인덱스의 적절한 사용에 대해서 알아보고자 한다.

글 정리 출처

https://velog.io/@gillog/SQL-Index%EC%9D%B8%EB%8D%B1%EC%8A%A4

Deep Inside T-SQL (손호성 저) -영진 출판