종식당

[매일메일 2025-02-11] 데이터베이스 인덱스에 대해서 설명해주세요. 본문

매일메일

[매일메일 2025-02-11] 데이터베이스 인덱스에 대해서 설명해주세요.

종식당 2025. 2. 14. 00:23
728x90
반응형

🍳 인덱스

  • 인덱스는 데이터베이스 테이블의 검색 속도를 향상하기 위한 자료구조로 백과사전의 색인과 같다.
  • 저장되는 컬럼의 값을 사용하여 항상 정렬된 상태를 유지하는 것이 특징이다.
  • 이러한 특징으로 인해 인덱스는 INSERT, UPDATE, DELETE의 성능이 희생된다는 것이 단점이다.

🥬 인덱스는 어떤 자료 구조로 이루어져 있나요?

  • MYSQL InnoDB를 기준으로 B+Tree와 같은 변형 B-Tree 자료구조를 이용해서 인덱스를 구현한다.
    기본 토대는 B-Tree 인덱스이기 때문에 이를 기준으로 설명한다.
    B-Tree 인덱스는 칼럼의 값을 변형하지 않고 인덱스 구조체 내에서 항상 정렬된 상태로 유지한다.
  • B-Tree에서는 크게 3가지 노드가 존재한다. 최상위에 하나의 루트 노드가 존재하며, 가장 하위 노드인 리프 노드가 존재한다. 
    이 두 노드의 중간에 존재하는 브랜치 노드가 존재한다. 최하위 노드인 리프 노드에는 실제 데이터 레코드를 찾아가기 위한 주솟값을 가지고 있다.
  • InnoDB 스토리지 엔지엔서는 세컨더리 인덱스(프라이머리 인덱스를 제외한 모든 인덱스)의 리프 노드에는 레코드의 PK가 저장된다.
    따라서 인덱스 검색에서는 레코드를 읽기 위해 PK를 가지고 있는 B-Tree를 다시 한번 검색해야 한다. 

🍞 MySQL 스캔 방식은 어떤 게 있나요?

  • 🚓 인덱스 레인지 스캔
    검색할 인덱스 범위가 결정되었을 경우 사용하며 가장 빠르다.
    인덱스에서 조건을 만족하는 값이 저장된 시작 리프 노드를 찾는다 -> index seek
    시작 리프 노드부터 필요한 만큼 인덱스를 차례대로 읽는다 -> index scan
    인덱스 키와 레코드 주소를 이용해 저장된 페이지를 가져오고 레코드를 읽어온다.
    레코드를 읽어오는 과정에서 랜덤 IO가 발생할 수 있다. 읽어야 할 데이터 레코드가 전체 20-25%의 경우에는 풀 데이터 스캔(순차 IO를 이용) 이 더욱 좋을 수 있다.

  • 🛻 인덱스 풀 스캔
    인덱스를 사용하지만 인덱스를 처음부터 끝까지 모두 읽는 방식
    인덱스를 ABC순서로 만들었는데 조건절에 B 혹은 C로 검색하는 경우 사용
    인덱스를 생성하는 목적은 아니지만, 그래도 풀 테이블 스캔보다는 낫다.

  • 🚛 루스 인덱스 스캔 (위 두 개는 타이트 인덱스 스캔)
    듬성듬성하게 인덱스를 읽는 것
    중간에 필요하지 않은 인덱스 키 값은 무시하고 다음으로 넘어가는 형태로 처리
    group by, max, min함수에 대해 최적화하는 경우에 사용

728x90
반응형