본문 바로가기

CS/DB

[DB 스터디 3주차] Index

목차

    📌  Index

    Q) 랜덤 I/O와 순차 I/O에 대해서 설명해주세요.

    I/O

    Input, output

     

    랜덤 I/O

    • 읽어야하는 데이터가 물리적으로 불연속적으로 있기 때문에 디스크 헤더를 이동 시킨 다음 데이터를 읽는 것
    • 인덱스 레인지 스캔 시 사용

    순차 I/O

    • 읽어야하는 데이터가 연속적으로 있어 순서대로 읽는 것
    • 테이블 스캔 시 사용

    디스크 성능/쿼리튜닝

    • HDD와는 다르게 SSD는 디스크 원판이 없어서 랜덤 I/O와 순차 I/O가 큰 차이가 없을 것 같지만 SSD에서도 랜덤 I/O는 순차 I/O 대비 throughput이 떨어짐
    • 쿼리 튜닝의 목적->랜덤I/O를 줄이는 것->꼭 필요한 데이터만 읽도록 쿼리 개선

    Q) 인덱스에 대해서 설명해주세요.

    인덱스(index)

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

    Q) 인덱스의 동작 방식에 대해서 설명해주세요.

    1. 사용자가 쿼리를 실행할 때, DBMS가 쿼리의 조건과 일치하는 인덱스가 있는지 검색
    2. 적절한 인덱스가 있다면, 그 인덱스 내에 저장된 키 값들 중 쿼리 조건에 맞는 것들을 검색. 인덱스의 데이터 구조 덕분에 전체 데이터를 순차적으로 검색하는 것보다 빠르게 키 값 탐색
    3. 결과 키 값들에 대응되는 실제 데이터 조회하여 반환

    Q) 어떤 기준으로 인덱스를 설정해야할까요?

    인덱스 설정 기준

      • 카디널리티
        카디널리티가 높은 컬럼
        * 카디널리티 = 특정 데이터 집합의 유니크한 값의 개수
      • 선택도
        선택도가 낮은 컬럼
        * 선택도↑ = 한 컬럼의 값을 통해 여러 row 찾아짐.
      • 조회 활용도
        조회 활용도가 높은 컬럼
        * 조회활용도 = 해당 컬럼이 실제 작업에서 얼마나 활용되는지
      • 수정빈도
        수정빈도가 낮은 컬럼

    Q) 이름, 국가, 성별이 있는 테이블에서 인덱스를 어떻게 걸어야할까요?

    • 이름, 국가, 성별이 있는 테이블에서는 자주 검색되는 열을 기준으로 인덱스를 설정해야 함
    • 조회 활용도가 높고, 선택도/카디널리티가 낮을 거 같은 이름에 인덱스를 걸 것.
    •  

    Q) 테이블에 인덱스를 많이 설정하면 좋을까요?

    • 인덱스는 DB 메모리를 사용하여 테이블 형태로 저장됨 -> 저장 공간은 비례함

    Q) 커버링 인덱스(Covering index)에 대해서 설명해주세요.

    • 쿼리를 충족시키는 데 필요한 모든 데이터를 갖고 있는 인덱스
    • *쿼리를 충족시킨다 : SELECT, WHERE, ORDER BY, LIMIT, GROUP BY 등에서 사용되는 모든 컬럼이 인덱스 컬럼 안에 다 포함되어 있는 경우
    • 데이터 파일 자체에 접근하지 않고 인덱스에서 모든 필요 정보를 검색 가능한 경우

    Q) 다중 컬럼 인덱스(Multi-column index, 복합 인덱스)에 대해서 설명해주세요.

    • 2개 이상의 컬럼을 묶어서 사용
    • 빈번하게 같이 조회되는 컬럼에 대해 조회 성능을 향상시키기 위함
    • 상위 인덱스 값에 대한 하위 인덱스 값을 같이 저장 -> 어떤 인덱스를 먼저 사용할지를 판단하는 과정이 없음
      -> 인덱스 성능을 비교하는 과정 생략, 스캔할 인덱스의 개수 ↓
    • 컬럼의 순서에 따라 쿼리 성능이 좌우될 수 있음

    Q) B-Tree 인덱스와 B+Tree 인덱스에 대해 설명해주세요.

    B-Tree

     

    • B-Tree는 균형 트리로, 각 노드가 여러 개의 자식을 가질 수 있는 자료구조입니다.
    • 각 노드는 키와 포인터를 가지고 있습니다. 리프 노드에는 실제 데이터 레코드를 가리키는 포인터가 있습니다.
    • 모든 리프 노드가 동일한 레벨에 있어야 하는 것이 B-Tree의 특징 중 하나입니다.
    • B-Tree는 균형을 유지하면서 삽입, 삭제, 검색 연산을 수행할 수 있습니다.
    • 대부분의 데이터베이스 시스템에서 인덱스를 구현하는 데에 B-Tree를 사용합니다.

    B+Tree

    • B+Tree는 B-Tree의 변형
    • B+Tree도 각 노드가 여러 개의 자식을 가지고 있지만, 데이터 레코드는 리프 노드에만 저장됨
    • 리프 노드는 연결 리스트로 연결되어 있어 범위 검색 쿼리에 유리-> 데이터베이스에서 범위 검색을 자주 사용하는 경우에 효율적
    • 인덱스 검색이나 범위 검색 쿼리에 대해 B+Tree는 더 높은 효율성을 보임. 또한, 디스크 I/O를 줄일 수 있어 데이터베이스 성능에 도움.
    • 대부분의 현대적인 데이터베이스 시스템에서는 B+Tree를 인덱스 구현에 사용

    Q) Hash 인덱스에 대해서 설명해주세요.

    • 해시 테이블을 사용하여 데이터를 인덱싱하는 구조
    • 동등 비교 검색 최적화 시에 많이 사용됨(=, IN, IS NULL, IS NOT NULL, <=, => 등)
    • 검색하고자 하는 값을 해시 함수를 통한 연산 결과 값을 키로 지정하여, 해당 키를 가진 버켓을 찾아내는 방식
    • * 버킷: 인덱스 각 키값과 레코드의 주소값 등의 정보를 두는 공간
    • 연산이 빠르나, 해싱된 값을 저장하기 때문에 범위 검색이 불가

    Q) 클러스터링 인덱스에 대해서 설명해주세요.

    • 데이터를 인덱스의 순서대로 물리적으로 저장하는 방식
    • 테이블 당 오직 하나만 존재
    • 범위 검색, 순차 접근 시 성능 향상
    • 특정 키 값의 데이터를 찾거나, 키 값의 범위 조회 쿼리 빠름
    • 물리적 저장방식으로 데이터 삽입/삭제/갱신 시 많은 작업 요구

    Q) 인덱스 스캔 방식에 대해서 설명해주세요.

    풀스캔

    • 인덱스의 처음부터 끝까지 모든 엔트리를 순차적으로 검사
    • 특정 조건을 만족하는 레코드를 찾거나, 인덱스의 대부분을 검색해야 할 때 유용

     

    범위스캔

    • 시작점과 끝점을 정하여 해당 범위 안에 있는 인덱스 엔트리만을 검색하여 효율적
    • 범위, 부등호 사용 쿼리에 주로 활용

     

    유니크스캔

    • 유니크 인덱스(중복 허용X 인덱스)를 통해 단일 레코드를 검색할 때 사용.
    • 단일 값 요구시 매우 빠름

    Q) 쿼리 실행 계획에 대해서 설명해주세요. 실행 계획을 확인해본적이 있나요?

    • 데이터베이스에서 쿼리를 실행하는 방법을 결정하는 것
    • DBMS은 쿼리를 실행하기 위해 내부적으로 최적화 과정을 거침
    • 테이블 접근 방식, 인덱스 사용, 조인 방법, 정렬 및 필터링, 실행 순서 등을 포함
    • 일반적으로 사용자는 직접 실행 계획을 작성/변경 X
    • DBMS가 최적화 과정을 거쳐 자동으로 실행 계획을 생성하고 사용

    Q) 힌트에 대해서 설명해주세요.

    힌트

    • 개발자가 직접 쿼리에 주석 형태로 작성하여 DBMS에게 실행계획을 제어하는 방법
    • 일반적으로 특정 인덱스 사용을 강제하거나 조인 방법을 지정하는 등의 목적으로 사용됨
    • 개발자는 DBMS가 자동으로 선택하는 실행 계획을 변경할 수 있음
    • 주로 특정 상황에서 DBMS의 최적화된 실행 계획이 예상대로 동작하지 않을 때 사용됨.

    Q) 인덱스가 잘 동작하고 있는지 어떻게 확인할 수 있을까요?

    • 실행 계획 확인
    • 테이블 및 인덱스 통계 확인
    • 인덱스 사용량 모니터링

    Q) 인덱스 사용시 주의해야할 점에 대해서 알려주세요.

    • 인덱스를 지나치게 많이 생성하면 쓰기 작업에 부담을 줄 수 있음
    • 인덱스는 검색 속도를 향상시키지만 추가적인 저장 공간을 필요로 하며 업데이트 작업이 빈번한 경우에는 신중히 고려

    Q) GROUP BY 사용시 인덱스가 걸리는 조건에 대해 설명해주세요.

    1. Group By절에 명시된 컬럼이 인덱스 컬럼의 순서와 위치가 같을 경우 인덱스 사용
    2. 인덱스를 구성하는 컬럼 중 뒤쪽에 위치한 컬럼들은 Group By에 명시되지 않아도 인덱스를 사용 가능
    3. Group By절에 명시된 컬럼이 하나라도 없는 경우 인덱스를 사용할 수 없음

    📌참고 자료

    https://velog.io/@ddangle/순차Sequential-IO와-랜덤Random-IO

    https://mangkyu.tistory.com/96

    https://velog.io/@jwpark06/%ED%9A%A8%EA%B3%BC%EC%A0%81%EC%9D%B8-DB-index-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0

    https://velog.io/@boo105/%EC%BB%A4%EB%B2%84%EB%A7%81-%EC%9D%B8%EB%8D%B1%EC%8A%A4

    https://velog.io/@juhyeon1114/MySQL-%EB%8B%A4%EC%A4%91-%EC%BB%AC%EB%9F%BC-Index

    https://velog.io/@dukyoung/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EC%8A%A4%ED%84%B0%EB%94%94-3%EC%A3%BC%EC%B0%A8