기술

DB Index

개복치 개발자 2021. 8. 14. 17:29

 DB인덱스에 관한 부분에 대해서 알아보겠습니다.

 

 이전에 기술면접 질문 중에 본 질문인데

 

 DB인덱스는 왜 붙이는가? DB인덱스를 붙이는게 좋다면 왜 모든 테이블에 Index를 붙이지 않는가?

 

 에 대해서 들어본 적이 있습니다. 이 질문에 대해 대답하기 곤란하시다면 아래의 글을 읽어보시면 좋을 것 같습니다.

 

 자 우선은 index가 무엇인지 부터 직관적으로 알아봅시다.

 

 

 위와 같이 서류정리함? 정도로 생각하시면 되는데, 각 분류마다 택을 붙여서 쉽게 찾아보게 만든 것이라고 생각하면 됩니다.

 

 저 서류들을 1번부터 1000번까지 훑어서 찾는 것 보다, 저 데이터가 포함하는 인덱스로 가서 데이터를 찾는게 훨씬 더 좋습니다.

 

 인덱스를 이용하면 얻는 장점으로는 당연히 전체데이터 훑기(full scan)보다 검색속도가 올라갑니다.

 

 장점으로 정리해보면

 

 - 테이블을 조회하는 속도와 성능 향상 가능

 - 전반적인 시스템 부하를 줄일 수 있음

 

 이라고 할 수 있을 것 같습니다.

 

 그러면은 아 인덱스를 이용하면 편하고 좋구나 라고 알게 되었습니다. 근데 왜 모든 DB에 index를 사용하지 않는걸까요?

 

 당연히 장점이 있는 것 만큼, 단점이 있습니다. 

 

 그러면 단점은 뭘까요? 단점으로는

 

 - 인덱스를 관리하기 위해 DB의 10% 정도 해당되는 저장공간이 필요하다.

 - 인덱스를 관리하기 위한 작업이 필요하다.

 - 인덱스 잘못 사용할 경우 성능 저하의 원인이 된다. 

 

 그리고 생성(Create), 삭제(Delete), Update(수정)을 할 경우 문제가 생기기 시작합니다. 

 

 생성의 경우 잘 못 생성할 경우, 쿼리 속도가 느려질 수 있고, 삭제 수정의 경우 인덱스를 삭제하지 않고 사용하지 않는 형태로 관리하기 때문에, DB가 비대해져 성능 저하가 일어날 수 있습니다.

 

 그러면 index를 사용하면 좋은 경우를 정리해보면

 

 - 규모가 작지 않은 테이블

 - Create, Update, Delete 가 자주 일어나지 않는 컬럼

 - JOIN, WHERE, ORDER BY 에 자주 사용되는 컬럼

 - 데이터의 중복도가 낮은 컬럼

 

 이라고 정리해볼 수 있습니다.

 

 Index의 자료구조는 해시테이블 or B+Tree가 사용됩니다.

 

 index 찾아보다가 보면 PK라는 개념이 나옵니다.

 

 PK(Primary Key)는 이름에서 볼 수 있듯이 행을 검색할 때 사용할 수 있는 고유한 키입니다.

 

 한 테이블 내에 Row가 다른 Row와 구별되는 키값이라고 생각할 수 있습니다.

 

 PK는 Row마다 유일해야 하며, NULL일 수 없고, 변경될 수 없어야 합니다.

 

 여기까지 정리해보겠습니다.

 

 

 

 참조

 

- https://www.youtube.com/watch?v=NkZ6r6z2pBg 

https://mangkyu.tistory.com/96

 

[Database] 인덱스(index)란?

1. 인덱스(Index)란? [ 인덱스(index)란? ] 인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다. 만약 우리가 책에서 원하는

mangkyu.tistory.com

https://hodongman.github.io/2019/01/14/Database-PK%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%B4%EC%95%BC-%ED%95%98%EB%8A%94-%EC%9D%B4%EC%9C%A0.html

 

Table 작성 시 PK를 무조건 사용해야 하는 이유 - 기술 블로그

RDBMS의 Table에서 가장 먼저 고려하는, 개별 행을 검색하는 데 사용할 수있는 고유 한 키(Primary Key)에 대해 정리할 생각입니다. 기본키(Primary Key)는 시스템이 한 테이블에 있는 Row가 다른 Row와 구별

hodongman.github.io

 

'기술' 카테고리의 다른 글

프로토콜 버퍼란?  (0) 2022.12.01
객체지향의 원칙  (0) 2021.10.20
Heap Stack  (0) 2021.09.27
OSI 7 Layer  (0) 2021.08.24
프로세스(Process)와 쓰레드(Thread)의 차이  (0) 2021.08.13