본문 바로가기

TIL

6/3[TIL] Database Indexing이란 무엇이며 왜 하는가요?

Database Indexing이란 무엇이며 왜 하는가요?

 

이를 알아보기 전에 Index이라는 것을 알아보자.

출처 : https://www.bennadel.com/blog/3467-the-not-so-dark-art-of-designing-database-indexes-reflections-from-an-average-software-engineer.htm

Index란? 추가적인 쓰기 작업과 저장 공간들을 활용해서 DB 테이블의 검색 속도를 향상하기 위한 자료 구조라고 한다. 우리는 두꺼운 책을 읽게 되면 간혹 책의 맨 앞이나 맨 뒤에 색인을 추가하여 보다 원하는 내용을 빠른 시간 내에 찾아볼 수 있다. 우리가 만약 책에서 원하는 내용을 찾을 때 책의 처음부터 끝까지 모든 페이지를 찾아보는 것은 정말 오랜 시간이 걸리게 될 것이다. 그렇기에 색인(index)을 이용한다면 이 문제를 해결할 수 있다.

DB에서도 또한 크게 상황이 다르지 않다. Index는 DB 내에서 모든 테이블을 검색하면 시간이 오래 걸리기에 데이터와 데이터의 위치를 포함한 자료구조를 생성하여 보다 빠르게 조회 할 수 있도록 해준다.

 

Index를 활용하게 되면 데이터를 조회하는 역할인 SELECT 뿐만 아니라 UPDATE, DELETE 의 성능 또한 향상된다. 왜냐하면 어떠한 것에 대한 해당 연산을 하기 위해서는 결국에는 해당 대상을 조회해야 작업을 진행할 수 있기 때문이다. Query문에 UPDATE문이나 DELETE문 뒤에 WHERE에 조건을 적는 것을 생각해보면 될 것이다.

 

1
2
3
UPDATE Customers
SET ContactName = 'Alfred Schmidt', City= 'Frankfurt'
WHERE CustomerID = 1;
cs

 

만약에 index를 사용하지 않는다면 결국에는 전체를 다 탐색하기 때문에 처리 속도가 떨어지는 단점이 생긴다.

index를 사용하는 것은 정말 좋지만 그 만큼 index를 잘 관리하여야 많은 이점을 누릴 수 있다.

 

Index 관리는 어떻게 해야 할까?

DB관리시스템은 index를 항상 최신으로 정렬된 상태로 유지해야 사용자가 원하는 값을 빠르게 탐색해 낼 수 있다. 

그렇기에 index가 적용된 컬럼 부분에 INSERT, UPDATE, DELETE가 수행이 된다면 밑에 언급한 추가적인 연산을 해주어야 한다. 그리고 여기엔 그만큼의 오버헤드(어떤 처리를 하는 데 있어 들어가는 간접적인 처리시간 / 메모리)가 발생하게 된다.

 

INSERT(새로운 데이터에 대한 index를 추가)

 

UPDATE(기존에 있는 index를 사용하지 않음 처리를 하고 새로 갱신된 데이터의 index를 추가)

 

DELETE(삭제할 데이터를 사용하지 않는다는 작업을 진행)

 

 

Index 를 하는 데 있어 무조건 장점만이 존재할까? 그것은 아닌 것 같다.

Index의 장점과 단점

장점은 앞서 말한 내용을 토대로 보면

DB의 테이블들을 조회하는 속도가 빠르고 그렇기에 전반적인 시스템의 과부하를 줄여 줄 수 있다.

 

단점은 Index 자체를 관리하기 위해 전체 DB의 약 10% 정도에 해당하는 저장공간이 필요로 한다. 그리고 앞서 말한 부분처럼 Index를 관리하기 위해 추가 작업들이 필요하고 제일 중요한 단점이라고 생각되는데 Index를 잘못 사용할 경우 사용하지 않은 것만 못한 상황이 벌어질 수도 있다. 오히려 역효과가 발생하여 성능이 저하될 수도 있는 것이다.

 

예시를 들면 만약 CREATE, DELETE, UPDATE 가 빈번한 속성에 Index를 사용하게 되면 Index의 크기가 커져서 성능이 오히려 저하되는 역효과가 발생할 수 있다. 왜냐하면 DELETE와 UPDATE 연산 때문이다. 앞에서 설명한대로, UPDATE와 DELETE는 기존의 인덱스를 삭제하지 않고 '사용하지 않음' 처리를 해준다고 했는데 만약에 어떤 테이블에 UPDATE와 DELETE가 빈번하게 발생된다면 실제 데이터는 10만 건이지만 인덱스가 실제 데이터의 개수보다 더 크게 되어 배보다 배꼽이 더 큰 경우가 생기기 때문이다. 그렇게 되면 SQL문 처리 시 비대해진 Index 때문에 오히려 성능이 떨어지게 되는 역효과가 생기게 된다. 

 

Index를 사용하기에 좋은 환경에는 어떠 한 것들이 있을까?

검색/조회에 하는데 있어 특화된 장점을 가진 Index이기에 규모가 큰 DB 테이블에서 사용하기 좋을 것이다.

앞서 언급한 INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼과 

앞서 Index 개념적 측면에서 언급한 JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 ,

그리고 데이터의 중복도가 낮은 들이 존재한다.

 

인덱스를 사용하는 것만큼이나 생성된 인덱스를 관리해주는 것도 중요하다. 그렇기 때문에 사용하지 않는 인덱스는 바로 제거를 해주어야 한다. 

 

마무리하면서...

이 글의 주제인 Database Indexing이란 무엇이며 왜 하는가요?라는 질문의 답은 이 글에서 충분히 설명되었으리라고 본다.  Index라는 좋은 기능이 있는데 이 것을 잘 관리하면 조회 속도나 시스템 과부하 같은 문제점들을 해결해 줄 수 있지만 관리를 제대로 하지 못한다면 사용하지 못한 것만 못하다는 점을 꼭 반드시 명심하여야 할 것 같다.

 

 

 

참고 출처 : https://mangkyu.tistory.com/96