[Back-end] 인덱스와 작동 방식

Geun·2022년 3월 22일
0

Back-end

목록 보기
32/74

DB Index

인덱스는 추가적인 쓰기작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조이다.

목적

RDBMS에서 검색속도를 높이기 위한 기술이다.
Table의 Column을 색인화 한다. (따로 파일로 저장한다.)

Index 관리

DBMS는 index를 항상 최신의 정렬된 상태로 유지해야 원하는 값을 빠르게 탐색할 수 있다.
인덱스가 적용된 Column에 INSERT, UPDATE, DELETE가 수행된다면 다음과 같은 연산을 추가적으로 해주어야 한다.

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

과정

Table을 생성하면 MYD, MYI, FRM 3개의 파일이 생성된다.

  • FRM: 테이블 구조가 저장되어 있는 파일
  • MYD: 실제 데이터가 있는 파일
  • MYI: Index 정보가 들어가 있는 파일

Index를 사용하지 않는 경우, MYI 파일은 비어져 있다.
인덱싱하는 경우, MYI파일이 생성된다.
이후 사용자가 Select 쿼리로 Index를 사용하는 Column을 탐색시 MYI파일의 내용을 검색한다.

Index의 장단점

  • 장점
    • 테이블을 조회하는 속도와 그에 따른 성능을 향상시킬 수 있다.
    • 전반적인 시스템의 부하를 줄일 수 있다.
  • 단점
    • 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 필요하다.
    • 인덱스를 관리하기 위해 추가 작업이 필요하다.
    • 인덱스를 잘못 사용할 경우 오히려 성능이 저하되는 역효과가 발생할 수 있다.

CREATE, DELETE, UPDATE가 빈번한 속성에 인덱스를 걸게 되면 인덱스의 크기가 비대해져 성능이 오히려 저하될 수도 있다.

상황 분석

  • 사용하면 좋은 경우
    1. Where절에서 자주 사용되는 Column
    2. 외래키가 사용되는 Column
    3. Join에 자주 사용되는 Column

  • Index 사용을 피해야 하는 경우
    1. Data 중복도가 높은 Column
    2. DML(데이터 조작 언어 : Data Manipulation Language)이 자주 일어나는 Column

DML이 일어났을 때의 상황

  • INSERT
    기존 Block에 여유가 없을 때, 새로운 Data가 입력된다.

새로운 Block을 할당받은 후 Key를 옮기는 작업을 수행한다.(많은 양의 Redo가 기록되고 유발된다.)
Index split 작업동안 해당 Block의 Key값에 대해서 DML이 블로킹된다.(대기 이벤트 발생)

  • DELETE
    Table에서 Data가 delete되는 경우: Data가 지워지고 다른 Data가 그 공간을 사용할 수 있다.
    Index에서 Data가 delete되는 경우: Data가 지워지지 않고 사용 안 됨 표시만 해둔다.

Table의 Data수와 Index의 Data수가 다를 수 있다.

  • UPDATE
    Table에서 update가 발생하면 Index는 Update할 수 없다.
    Index에서는 Delete가 발생한 후 새로운 작업의 Insert작업을 한다.

참고자료

https://gyoogle.dev/blog/computer-science/data-base/Index-.html
https://mangkyu.tistory.com/96

0개의 댓글