본문 바로가기

Database/Postgresql

Index가 무엇인가? 그리고 장 단점 정리

두꺼운 책 맨 뒤(혹은 앞)에 있는 '색인' 이 이거라고 보면 된다.

 

뭐 예를들어 자바스크립트 책을 공부하는데 갑자기 함수를 공부하고 싶으면

색인(index)를 찾으면 된다.

 

1장 변수 12p

  1.1 var의 정의

  1.2 let의 정의..

2장 함수 25p

   2.1 함수 정의와 선언

   2.2 콜백함수

 

미리 색인을 설정해 놓으면 25p로 바로 갈수 있는 원리와 비슷하다

 

또 다른 비유를 들자면, 도로 표지판이라고 보면 된다 

내가 원하는 데이터를 찾기위해 떠나는 여정(?)이라고 할까?

 

'저 서울에서 부산 가려고 하는데 어떻게 가요?'

'아 일로 가면 대전으로 가고요, 대전에서 대구 가고요, 대구에서 부산가면 됩니다' 

 

 

먼저, 우리가 어떤 정보를 조회하는 쿼리를 작성하면 내부적으로 한줄 한줄 조회하여

(full table) 우리가 원하는 정보를 찾게 된다. 

 

그러나 인덱스를 설정하면, 전에 포스팅했던 block 단위로 새로이 정렬을 하게 된다.

예를들어 username이라는 컬럼에 인덱싱을 해놓았다면, 알파벳 순 같은 나름의 규칙을 설정한다.

 

이 인덱스에도 종류가 참 많다.

B-tree(자료구조의 그거 맞다) Hash, Gin 등등...

 

그러나 유데미 stephen 선생님께선 B-tree가 거의 99% 사용하니 

수많은 인덱스 타입에 겁먹지 말라고 하시더라.

추후 레벨이 올라가면 다른 타입도 포스팅 해보겠다.

 

아 참고로, Postgres에서, UNIQUE 타입이나 PK에는, 자동적으로 내부 index가 형성되니

또 인덱스를 만들어서 중복작업을 할 필요가 없다.

 

 

출처: https://mydbops.wordpress.com/2020/09/25/deduplication-of-b-tree-indexes-in-postgresql-13/

 

 

쉽게 말하면 스무고개 비슷하다 (ㅋㅋ) 

내가 아직 자료구조 B-tree를 공부하지 않아 자세한 설명은 좀 그렇지만...

 

위의 예시에서 만약 숫자 5를 찾아간다고 생각해보자. 

그럼 Root node 4에서 시작해 Parent node 6 그리고 마지막으로 Leaf node 5로 가면 끝!

 

그럼 실제로 index를 PGadmin 에서 만들어 보면,

 

만드는법은 간단하다 CREATE INDEX ON 테이블명  (컬럼명) 하면 끝!

없애는 법도 그냥 DROP INDEX (인덱스명) 하면 끝이다.

 

여기서 주의할점은, 인덱스 네이밍을 규칙에 맞게 써야 한다는 것!
그렇지 않으면 인덱스를 중복생성하는 등의 낭패를 볼 수 있다.

현업에서 쓰기로한 규약이 아니면 저 컨벤션을 표준으로 삼아보자.

 

그럼 실제로 속도 차이가 얼마나 나는지 알아보았다.

 

인덱스 없이 username = 'Emil30' 을 검색 한 결과이다

Execution Time 이 0.817 이 나왔다.

 

인덱스를 적용하니 Planning Time이 쬐금 늘어나기는 했지만

Execution Time이 0.174대가 나왔다! 퍼센트로 따지면 한 450%정도 되는것 같다.

확연하게 검색 관련해 인덱스를 설정하면 속도가 빨라지는걸 확인했다.

 

하지만, 이제는 인덱스의 단점을 알아보자.

 

1. 데이터베이스는 끊임없이 CRUD가 일어난다. 그 말은 이 인덱스도 

계속 업데이트를 해줘야 한다는 뜻이다. 속도 저하가 일어날 수 있다는것.

 

2. 인덱스 자체의 용량 문제가 있다.

 

인덱스의 용량을 알아보고 싶다면

SELECT pg_size_pretty(pg_relation_size('users_username_idx')); 을 입력하면 된다.

 

에이 뭐 184kb 이정도야.. 라고 생각하겠지만

데이터가 1만개라고 가정하면 기가의 영역으로 넘어가게 된다.

이 부담을 안고서라도 인덱스를 만들어야 하는가? 는 온전히 개발자의 몫이다.

 

이 정도면 인덱스에 관한 굉장히 기본적인 내용을 다루었다고 생각한다.

 

물론 복합컬럼 인덱스나 각종 다양한 인덱스 종류 등이 있지만

추후 렙업시 또 포스팅할 예정이다.

'Database > Postgresql' 카테고리의 다른 글

Postgresql 내부 살펴보기  (0) 2023.04.28
Instagram DB practice(1)  (0) 2023.04.27