Index

lovi0714·2022년 6월 22일
0

📌 Index란?

  • 우리가 책을 읽는다고 가정하자.
  • 책을 읽을 때 필요한 부분을 찾아가기 위해 우리는 첫 부분에 있는 목차나, 뒷부분에 A,B,C 이런 식으로 정리되어있는 Index를 참고해서 원하는 페이지를 찾아간다.
  • 만약 이런 목차가 없다면 최악의 경우 우리는 첫페이지부터 끝까지 모두 읽어가며 찾아야 할 것이다.

👉 지정한 컬럼들을 기준으로 메모리 영역에 일종의 목차를 생성하는 것이다.

📌 Index가 필요한 이유

  • 위에서 든 예시처럼 첫페이지부터 끝까지 찾는 것을 Full Table Scan이라고 한다.
  • 기업에서는 보통 대용량 데이터를 다루는데 이때 Full Table Scan을 하게 된다면 매우 비효율적이므로, 주소록과 같은 인덱스를 만들어서 데이터를 관리하게 된다.

📌 Index 적용

INSERT, UPDATE, DELETE의 성능을 희생하고 SELECT(Query)의 성능을 향상시킨다.

  • 여기서 UPDATE, DELETE는 행위가 느린 것이지 UPDATE, DELETE를 하기 위해 해당 데이터를 조회하는 것은 인덱스가 있으면 빠르게 조회가 가능하다.
  • 이 때문에 인덱스를 활용하면 UPDATE, DELETE의 성능이 함께 향상된다고 한 글도 있는 것 같다. 하지만 밑에서 설명하는 내용 때문에 UPDATE, DELELTE가 빈번한 곳에는 사용을 지양해야한다.

📌 INSERT, UPDATE, DELETE

DBMS는 index를 항상 최신의 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색 할 수 있다. 때문에 INSERT, UPDATE, DELETE가 수행 될 때 각각 다음과 같은 연산이 필요하다.

  • INSERT : 새로운 데이터에 대한 인덱스를 추가함
  • DELETE : 삭제하는 데이터의 인덱스를 사용하지 않는다는 작업을 진행함
  • UPDATE : 기존의 인덱스를 사용하지 않음 처리하고, 갱신된 데이터에 대한 인덱스를 추가함

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

여기서 주목해야 할 점은, '삭제'가 아닌 '사용하지 않음' 이다. UPDATE, DELETE문이 빈번하게 발생하게 되면 실제 데이터보다 인덱스가 훨씬 많이 생성되어 SQL문 처리 시에 너무 많은 인덱스에 의해 오히려 성능이 저하될 것이다. 인덱스를 사용하는 것 만큼 관리해주는 것도 중요하다. 사용되지 않는 인덱스는 바로 제거해주자.

📌 장점과 단점

장점

  • 테이블을 조회하는 속도와 그에 따른 성능 향상
  • 전반적인 시스템의 부하를 줄여줌

단점

  • 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요
  • 인덱스를 관리하기 위해 추가 작업이 필요
  • 인덱스를 잘못 사용할 경우 오히려 성능이 저하되는 역효과 발생 가능성

👉 위에서 설명한 내용과 일치한다.

📌 Index 컬럼 선정 기준

카디널리티(Cardinality)가 가장 높은 것을 잡는 것이 유리하다.

  • 카디널리티(Cardinality)란 해당 컬럼의 중복된 수치를 말한다.
  • Cardinality가 낮다. -> 성별, 학년 등
  • Cardinality가 높다. -> 계좌번호, 주민등록번호 등
  • 인덱스로 최대한 효율을 뽑아내려면 해당 인덱스로 많은 부분을 걸러내야 한다.
  • 성별이 인덱스 컬럼일 때 -> 남/녀 중 하나를 선택하기 때문에 또 검색이 필요할 확률이 높아짐
  • 주민등록번호나 계좌번호가 컬럼일 때 -> 인덱스를 통해 대부분을 걸러내기 떄문에 빠르게 검색 가능

📌 마무리

  • Index의 중요성은 들어봤지만 막상 데이터를 많이 다루지 않는 개인 프로젝트만 진행하고 있어 우선 순위를 자꾸 미뤘던 것 같다.
  • 하지만 실제 서비스를 맡아서 진행하게 되면 성능에 대한 고민을 안할 수 없을 것이고 미리 잘 이해하고 있는 것이 중요하다는 생각이 들었다.
  • 처음 공부 시작할 땐 Java만 진짜 잘하면 되는 줄 알았는데 웹 개발자, 백엔드 개발자로 일할 것이기 떄문에 특히 네트워크나 DB 쪽에 약하면 아예 생각할 수 있는 영역이 줄어드는 느낌인 것 같다.
  • 좋은 블로그가 많아서 다행.

📌 reference!

https://jojoldu.tistory.com/243
https://www.youtube.com/watch?v=9ZXIoh9PtwY
https://mangkyu.tistory.com/96

profile
공부 기록

0개의 댓글