인덱스 단편화

무지성개발자·2023년 10월 28일
0

단편화

단편화란 저장공간이 듬성듬성 비어있어 데이터가 연속되지 않고 여러 조각이 난 것을 말한다.

문제점

단편화는 저장공간의 효율을 떨어 트리고 읽기, 쓰기, 수정 작업의 속도 또한 느려지게 하는 문제가 있다.

인덱스의 단편화

MySQL은 B-tree 방식으로 인덱스를 관리한다. B-tree의 특징은 모든 작업이 leaf node에서 이루어지고 삽입, 삭제가 일어나면 node들을 재정렬한다.

문제는 삭제작업인데

  • InnoDB는 데이터를 삭제할 때 바로 삭제하지 않고 Marking만 해놓고 나중에 삭제와 재정렬.
  • 이 상태에서 데이터가 추가
  • Marking만 있고 실제 빈 공간은 없없음.
  • 새로운 공간에 데이터가 할당
  • 되고 Marking된 데이터가 지워지면 빈공간이 남음 -> 단편화 발생.

index skew

인덱스의 분포도가 고르지 못한 것을 말한다. delete Marking된 데이터는 지워진 것이라고 인식된 상태여서 데이터를 사용할 땐 사실상 빈공간이다.

이 때 특정 leaf Node들의 데이터가 많이 삭제된 것이면 아직 재정렬을 하지 않아 leaf Node들의 데이터의 불균형이 일어나며 이렇게 인덱스의 불균형 수치가 높은 index skew 현상은 데이터 읽기의 효율이 떨어진다.

단편화 확인하기

300만건의 데이터를 가지고 있는 테이블을 통해 확인해보겠다.
OS에서 인식하고 있는 크기와 쿼리로 데이터를 확인하여 비교해보면 된다.

  • OS에서 인식한 크기
  • 쿼리로 확인한 데이터 크기

OS는 356MB로 인식하고 있는데 쿼리로 확인한건 142MB로 100MB가 넘는 차이를 확인 할 수 있었다.


한 줄평 : 실제 delete작업은 하나도 안한 테이블인데도 차이가 생각보다 나는데 아마 데이터 저장공간(페이지) 할당의 문제 같다.

profile
no-intelli 개발자 입니다. 그래도 intellij는 씁니다.

0개의 댓글