목차
📌 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) 인덱스의 동작 방식에 대해서 설명해주세요.
- 사용자가 쿼리를 실행할 때, DBMS가 쿼리의 조건과 일치하는 인덱스가 있는지 검색
- 적절한 인덱스가 있다면, 그 인덱스 내에 저장된 키 값들 중 쿼리 조건에 맞는 것들을 검색. 인덱스의 데이터 구조 덕분에 전체 데이터를 순차적으로 검색하는 것보다 빠르게 키 값 탐색
- 결과 키 값들에 대응되는 실제 데이터 조회하여 반환
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 사용시 인덱스가 걸리는 조건에 대해 설명해주세요.
- Group By절에 명시된 컬럼이 인덱스 컬럼의 순서와 위치가 같을 경우 인덱스 사용
- 인덱스를 구성하는 컬럼 중 뒤쪽에 위치한 컬럼들은 Group By에 명시되지 않아도 인덱스를 사용 가능
- Group By절에 명시된 컬럼이 하나라도 없는 경우 인덱스를 사용할 수 없음
📌참고 자료
https://velog.io/@ddangle/순차Sequential-IO와-랜덤Random-IO
https://mangkyu.tistory.com/96
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
'CS > DB' 카테고리의 다른 글
[DB 스터디 5주차] 트랜잭션, 회복 (0) | 2024.04.04 |
---|---|
[DB 스터디 4주차] 이상현상, 함수적 종속성, 정규화 (1) | 2024.03.27 |
[DB 스터디 2주차] SQL (2) | 2024.03.14 |
[DB 스터디 1주차] 데이터베이스 & 관계형 데이터베이스 기본 개념 (4) | 2024.03.06 |