책너두 6기 22일차

백은빈, 이성욱의 Real MySQL8.0 1권 p.228 ~ p.236

내용정리

08 인덱스

8.3.3.3 선택도(기수성)
  • 인덱스에서 선택도(Selectivity) 또는 기수성(Cardinality)은 거의 같은 의미로 사용되며, 모든 인덱스 키 값 가운데 유니크한 값의 수를 의미한다.
  • 인덱스 키 값 가운데 중복이 많을수록 기수성과 선택도는 낮아진다.
  • 선택도가 높을수록 검색 대상이 줄어서 빠르게 처리된다.
  • 선택도가 좋지 않다고 하더라도 정렬이나 그루핑과 같은 작업을 위해 인덱스를 만드는 것이 훨씬 나은 경우도 많다.
  • 인덱스에서 유니크한 값의 개수는 인덱스나 쿼리의 효율성에 큰 영향을 미친다.
8.3.3.4 읽어야 하는 레코드의 건수
  • 인덱스를 통해 테이블의 레코드를 읽는 것은 인덱스를 안 거치는 것 보다 높은 비용이 든다.
  • 100만 중 50만을 읽어야하는 쿼리가 있다면 무엇이 효율적일지 판단해야 한다.
    • 테이블 모두 읽고 50만개 버리기
    • 인덱스를 통해 필요한 50만 개 읽기

8.3.4 B-Tree 인덱스를 통한 데이터 읽기

mYSQL이 인덱스를 이용하는 대표적인 방법 세 가지

8.3.4.1 인덱스 레인지 스캔
  • 가장 대표적인 방법, 세 가지 중 가장 빠른 방법
  • 검색해야 할 인덱스의 범위가 결정됐을 때 사용하는 방식
  1. 인덱스 탐색(Index seek) : 인덱스에서 조건을 만족하는 값이 저장된 위치를 찾는다.
  2. 인덱스 스캔(Index scan) : 1번에서 탐색된 위치부터 필요한 만큼 인덱스를 차례대로 쭉 읽는다.
  3. 2번에서 읽어 들인 인덱스 키와 레코드 주소를 이용해 레코드가 저장된 페이지를 가져오고, 최종 레코드를 읽어온다.
8.3.4.2 인덱스 풀 스캔
  • 인덱스의 처음부터 끝까지 모두 읽는 방식
  • 쿼리가 인덱스에 명시된 칼럼만으로 조건을 처리할 수 있는 경우에 사용
  • 인덱스와 데이터 레코드까지 모두 읽어야 한다면 절대 이 방식으로 처리되지 않는다.
8.3.4.3 루스(Loose) 인덱스 스캔
  • 다른 DBMS에선 ‘인덱스 스킵 스캔’ 이라고 한다.

  • 타이트(tight) 인덱스 스캔으로 분류된다.
  • 인덱스 레인지 스캔과 비슷하게 작동하지만 중간에 필요치 않은 인덱스 키 값은 무시(SKIP)하고 다음으로 넘어간다.