230615 TIL #112 데이터베이스 인덱스

김춘복·2023년 6월 15일
0

TIL : Today I Learned

목록 보기
112/571

230615 Today I Learned

오늘은 DB의 인덱스에 대해 공부해봤다.


Index

데이터베이스 테이블의 검색 및 조회 성능을 향상시키기 위한 자료구조.

foodprice
부대찌개10000
햄버거6000
피자25000
초밥20000
갈비30000
  • 위의 테이블에서 price = 30000인 행을 찾으려면 where price = 30000으로 전체 테이블을 행 하나하나 다 순차적으로 조회해야한다. 데이터가 얼마 없으면 상관없지만 몇억개를 넘어가면 서버에 부하가 갈 것이다. 이러한 상황에서 Index를 사용하면 원하는 데이터를 더 빠르게 찾을 수 있다.

  • 사전적 정의로는 색인이다. 색인은 쉽게 찾아볼 수 있도록 일정한 순서에 따라 놓은 목록이다. 인덱스는 데이터베이스 테이블의 열에 대한 색인이라고 생각하면 된다. 특정 열 값을 기준으로 데이터를 정렬해 검색 작업을 더 효율적으로 수행할 수 있도록 도와준다.

  • 위의 테이블 기준으로 인덱스를 새로 만들면 price 테이블을 오름차순으로 정렬한 테이블이 따로 생성되고 원래 테이블의 행과 연결된다.

특징

인덱스는 항상 최신의 정렬상태를 유지한다.
인덱스도 하나의 데이터베이스 객체다.
데이터베이스 크기의 약 10% 정도의 저장공간이 필요하다.

  • 일반적으로 B+Tree의 자료구조로 인덱스를 저장한다.

  • 참고로 PK가 선언되어 있으면 인덱스가 필요없다. Clustered Index라고 PK나 고유한 열이 index의 역할을 한다.

장단점

index의 사용 이유
where(특정 조건)에 맞는 데이터를 full table scan 없이 빠르게 찾을 수 있다.
부하가 많이 걸리는 Order by에 의한 sort과정을 거치지 않는다.
min max 값을 레코드의 시작과 끝에서 가져만 오면 된다.

  • 장점
    결과값들이 정렬되어있기 때문에 데이터의 빠른 검색이 가능하고 쿼리의 성능이 향상된다.

  • 단점
    별도의 저장공간이 필요하다.
    항상 테이블의 데이터와 함께 인덱스의 정렬이 유지되어야 하므로 데이터 삽입, 수정, 삭제 시 인덱스 업데이트에 비용이 소모된다. 따라서 수정이 빈번한 속성이 인덱스를 걸면 오히려 성능이 저하될 수 있다.

생성 전략

무턱대고 인덱스를 만들면 오히려 비효율적이다. 아래의 조건에 맞는 컬럼을 인덱스로 만들면 효율적이다.

  1. Cardinality가 높은 컬럼(중복도가 낮은 컬럼)
  2. 조건(where)으로 자주 활용되는 컬럼
  3. ORDER BY로 자주 정렬되는 컬럼
  4. Join 조건으로 자주 사용되는 커럶
  5. 비교가 자주 되는 컬럼
  6. INSERT/ UPDATE / DELETE 로 수정이 빈번하지 않은 컬럼
profile
Backend Dev / Data Engineer

0개의 댓글