[F-Lab 챌린지 69일차 TIL]

성수데브리·2023년 9월 4일
0

f-lab_java

목록 보기
58/73

B-Tree 인덱스를 통한 읽기에서 레코드를 찾아가는 방법

스캔 : 차례대로 읽는 것

  1. 인덱스 레인지 스캔

    1. 검색해야 할 인덱스의 범위가 결정됐을 때 사용하는 방식
    2. 리프 노드에서 시작해야 할 위치를 찾으면 그때부터 순서대로 읽다가 멈춰야할 위치에 도달하면 멈춘다. (인덱스 탐색)
    3. 리프 노드에서 시작해야 할 위치를 찾으면 그때부터 순서대로 읽다가 멈춰야할 위치에 도달하면 멈춘다. (인덱스 탐색)
    4. 다음 리프 노드를 읽어야하면 포인터로 다음 리프 노드를 찾아가서 스캔한다. (인덱스 스캔)
    5. 인덱스 자체의 정렬 특성때문에 실제 레코드는 인덱스 키 컬럼의 정순 또는 역순으로 읽어오게 된다.
  2. 인덱스 풀 스캔

    1. 인덱스 처음부터 끝까지 모두 읽는 방식
    2. 인덱스가 (a, b, c) 컬럼으로 만들어져 있지만 조건절이 b나 c로 검색하는 경우
    3. 테이블 풀 스캔보다는 효율적이다.
    4. 인덱스에 포함된 컬럼으로만 쿼리를 처리할 수 있는 경우 테이블의 레코드를 읽을 필요가 없기 때문
  3. 루스 인덱스 스캔

    • 듬성 듬성 스캔하는 방식
    • Group by 나 집합 함수에서 max(), min() 을 최적화하는 경우에 사용된다.
    -- index (dept_no, emp_no)
    
    -- dept_no, emp_no 순으로 정렬되어 있으니 dept_no 을 만족하는 레코드중 emp_no 하나만 읽으면 된다.
    -- 이외의 레코드는 SKIP
    SELECT dept_no, MIN(emp_no)
    FROM dept_emp
    WHERE dept_no BETWEEN 'd002' AND 'd004'
    GROUP BY dept_no;
  1. 인덱스 스킵 스캔
    • 인덱스 구성하는 칼럼의 순서는 매우 중요함
      index(gender, birth_date)
      
      -- 기존에는 이 쿼리는 인덱스를 타지 않는다. 
      SELECT * FROM employees WHERE birth_date >= '1999-11-11'
      
      SELECT * FROM employ WHERE gender='M' AND birth_date >= '1999-11-11'
    • 8.0버전부터 인덱스 스킵 스캔 최적화 기능이 도입됌
    • WHERE 조건절의 검색을 위해 사용 가능하도록 용도가 훨씬 넓어진 것
    • 단점
      • 인덱스 선행 컬럼의 유니크한 값의 개수가 작아야 한다.
        • 스캔을 시작해야 할 시작 지점을 검색하는 작업이 많이 필요해지기때문.
      • 쿼리가 인덱스에 존재하는 컬럼만으로 처리 가능하다.

다중 칼럼 인덱스(=복합 인덱스)

  • 2개 이상의 컬럼을 포함하는 인덱스
  • 정렬 방식은 첫번째 컬럼을 정렬한 순서 내에서 다음 컬럼을 정렬한다.
  • 정렬 방식과 무관하게 정순, 역순으로 읽을 수 있다.

B-Tree 인덱스 정렬 & 스캔 방향

  • 페이지 간의 연결 방향은 양방향이지만 페이지 내의 인덱스 레코드는 단방향으로만 연결된 구조다.
  • 페이지 잠금?이 정순 스캔에 적합한 구조다

1회차 멘토링 복습

질문 : 1-1 자바에서 변수의 종류

답변

자바 변수는 네 가지가 있습니다.

  1. 지역변수
  2. 파라미터
  3. 인스턴스 변수
  4. 클래스 변수입니다.

이 변수들의 차이점은 참조 범위 입니다. 지역 변수, 파마리터는 스택 프레임에 할당되므로 한 스레드에서 독립적으로 사용하는 변수입니다.

인스턴스 변수는 객체 내에 존재하는 메서드에서 참조할 수 있습니다. 접근제어자가 public 일 경우 외부 객체에서도 접근이 가능합니다.

클래스 변수는 정적 변수라고도 하며 JVM의 method area 라는 공유 메모리 영역에 할당됩니다.

변수의 참조 범위를 제한하는 이유는 변수가 필요한 곳에서 독립적으로 사용되게 만들어 의도치 않은 변경을 방지합니다.

사이드 이펙트를 방지하기 위해 변수의 참조 범위를 최대한 줄이는 것이 중요합니다.

0개의 댓글