Developers Haven

(DH)블로그는 개발자들이 기술 정보를 찾아볼 수 있는 안식처가 되고 싶음을 희망하여 시작하게 되었습니다. 공부한 내용과 성장 과정을 기록해두었으니 편히 둘러보시길 바랍니다.

Welcome to DH's Blog

[기술공부]/Data

SQL 튜닝 - 인덱스에 대하여

DH’s Blog 2023. 10. 27. 14:30
반응형

DB 업무를 하다보면 같은 결과를 보여주는 쿼리라도 어떤 문법과 실행 방식을 사용하는지에 따라 쿼리 성능이 매우 달라진다. 특히 빅데이터 솔루션 회사에 근무를 하다보니 데이터 용량이 큰 테이블을 자주 조회해야하고, 다른 사용자들의 작업에도 영향이 가지 않아야해서 쿼리 성능에 대한 중요성을 더 체감하는 것 같다. 그래서 이번 기회에 SQL 튜닝에 대해서 자세히 공부를 시작하게 되었다.

 

SQL 튜닝이란?

SQL 튜닝이란 명령문(query)을 수행할 때 결과를 얻기 위한 수행시간을 단축시키고 리소스 사용량을 줄여주도록 만드는 과정을 의미한다. 이때, 리소스 사용량은 CPU, 메모리와 같은 IT 자원을 의미하며 이러한 자원 사용량을 줄이면서 결과를 얻는 것이 목표이다.

 

튜닝을 위한 방법을 알기 전에 튜닝에 필요한 기본 지식 부터 하나씩 배워볼 예정이며, 가장 먼저 인덱스에 대해서 알아보도록 하자.

 

인덱스(Index)란 무엇일까?

일반적으로 데이터는 입력(insert)되는 순서대로 저장되는데, 이때 원하는 데이터를 빠르게 찾도록 도와주는 것이 인덱스이다. 즉, 인덱스는 검색 속도를 향상시키는 자료구조검색 성능을 최적화시키는 것이 목적이다. 만약 인덱스가 없으면 데이터를 찾기 위해 테이블 전체를 스캔(full scan)하게 되어 검색 속도가 매우 느려진다. 흔히 인덱스를 책의 목차로 설명하는데 만약 천페이지가 넘는 백과사전에 목차가 없다면 원하는 정보를 찾는 것이 매우 힘들 수 밖에 없다.

 

인덱스의 특징

- 원하는 데이터를 빠르게 찾도록 도와주는, 검색 속도를 향상시켜주는 자료 구조를 의미한다.

- 단일 컬럼이나 여러 개의 컬럼을 이용하여 인덱스 생성이 가능하다.

- 일반적으로 인덱스 생성을 위해서 데이터베이스의 약 10% 추가 공간이 필요하다.

 

기본적인 인덱스 알고리즘은 B-Tree 구조(데이터베이스와 파일 시스템에서 자주 사용됨)를 가지고 있는데, 먼저 이진 트리 구조에 대해 짧게 알아보도록 하자.

 

 


이진 트리 구조에 대하여

이진 트리 구조

- 트리는 '탐색'을 위한 자료구조로, 각 노드들이 나무 가지 모양 처럼 연결되어 있다.

- 이진 트리는 자식 노드를 최대 2개까지만 가질 수 있다.

 

 

B-Tree(Balance-Tree) 구조에 대하여

B-Tree 구조

- 이진 트리 구조를 확장시켜 하나의 노드가 가질 수 있는 자식 노드가 2개 이상인 트리 자료 구조를 의미한다.

- 최상단 노드를 루트 노드(root node), 중간 노드를 브랜치 노드(branch node), 최하위 노드를 리프 노드(leaf node)라고 한다.

- 중간 노드(=브랜치 노드)는 다음 단계의 노드를 가리키는 포인터를 가지고 있다.

- 노드 내의 데이터는 항상 정렬된 상태를 유지하며 노드 간의 데이터 범위를 이용해서 자식 노드를 갖게 된다.

 

 

B-Tree 구조 인덱스 검색 예시 (찾고자 하는 인덱스 11이라 가정)

B-Tree 구조 인덱스 검색 방법

(1) 11은 10과 20의 중간값(10<11<20)이므로 10과 20 사이의 자식 노드로 이동

(2) 11은 13보다 작으므로(11<13) 첫번째 자식 노드로 이동

(3) Leaf node에서 11 검색 완료

 

 

B-Tree 구조가 자주 등장하게 될 것이니 만약 이해가 어렵다면 어떤 데이터를 찾기 위해 최상단 노드에서 부터 탐색을 시작해서, 중간 노드의 도움을 받아 마지막 노드에 도달하게 된다는 정도로만 이해를 하고 넘어가도록 하자.

 

 

 


 

결국, 인덱스는 하나의 자료구조로 검색 성능을 빨라지게 해주는 수단인 것이다. 하지만 인덱스에도 장단점이 존재하는데 이에 대해서 알아보자.

 

  인덱스의 장점 인덱스의 단점
1 원하는 데이터를 full scan 하지 않고 빠르게 검색할 수 있다. 인덱스 생성을 위해 데이터베이스의 약 10% 추가 공간이 필요하다.
2 쿼리 부하가 감소하여 시스템 전체 성능이 높아지게 된다. 인덱스는 항상 정렬된 상태를 유지하기 때문에 인덱스 컬럼의 insert / delete / update 수행에는 시간이 오래 걸릴 수 있다. (인덱스를 변경해야하므로)

 

그럼, 인덱스는 어떤 컬럼에 사용하면 좋을까?

- insert / delete / update가 빈번하게 일어나지 않는 대상 컬럼

- join, where, order by와 같은 조건문이 자주 사용되는 대상 컬럼

- 데이터의 중복이 없는 대상 컬럼

 

 

 

인덱스는 검색 속도를 향상시켜주지만 한편으로는 단점이 존재하기 때문에 오히려 과도한 인덱스가 쌓이면 데이터베이스의 성능 부하가 일어날 수 있다. 그러므로 효율적인 튜닝 방법을 먼저 생각해보고 그 다음으로 인덱스를 고려해보는 것이 좋다. 다음 시간에는 인덱스의 종류에 대해서 더 자세히 알아보도록 하자.

 

 

 

반응형