본문 바로가기
CS/데이터베이스

3주차. Index

by wch_t 2023. 11. 22.

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

     1) 랜덤 I/O

         - 데이터를 임의의 위치에서 읽거나 쓰는 방식

         - WHERE 절(조건)이 포함된 쿼리를 실행해 데이터를 조회/수정/삭제하는 상황

 

     2) 순차 I/O

         - 데이터를 순서대로 읽거나 쓰는 방식

         - 대체로 랜덤 I/O보다 빠르다.

 

     * 쿼리 튜닝

         - DB 성능을 향상시키기 위해서, 순차 I/O를 늘리고 랜덤 I/O를 줄이는 것

 

 

 

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

     1) 인덱스

         - DB에서 특정 열(컬럼)의 값을 기반으로 데이터에 빠르게 액세스할 수 있도록 하는 데이터 구조

         - 주로 검색 조건이 있는 WHERE 절에서 활용된다.

         - 연관된 테이블 간의 JOIN 작업에서 활용된다.

 

 

 

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

         - 주로 B-트리나 해시 함수를 기반으로 동작한다.

 

         1) B-트리

              - 노드 계층 구조를 갖추고 있어, 정렬된 상태를 유지해 이진 검색을 통해 효율적으로 키 값을 찾을 수 있게 도와준다.

              - 삽입 or 삭제 작업이 일어날 때마다 자동으로 균형을 유지한다.

 

         2) 해시 함수

              - 데이터의 각 키에 대해 고유한 해시 값을 생성(해싱)하여 인덱스를 구성한다.

 

 

 

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

         - 데이터베이스의 특성과 운영 환경을 고려해야 한다.

 

         1) 검색 빈도 (WHERE, JOIN..)

              - 자주 검색되는 열에 인덱스를 설정하는 것이 효과적

 

         2) 데이터의 고유성

              - 데이터의 고유성이 요구되는 열에는 고유 인덱스를 설정하는 것이 적절

                 ex. 기본키

 

         3) 업데이트 빈도와 오버헤드 고려

              - 삽입, 수정, 삭제가 빈번한 열에 대한 인덱스는 성능 오버헤드를 고려하여 설정

 

 

 

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

     1) 많이 설정했을 때 장점

         - 데이터를 빠르게 검색하게 하여, 성능을 향상시킬 수 있다.

 

     2) 단점 및 고려사항

         - 데이터의 삽입, 수정, 삭제 작업의 오버헤드가 크게 발생할 수 있다.  → 4-3)

         - 많은 인덱스는 디스크 공간 사용량을 증가시킬 수 있다.

         - 인덱스의 선택도가 높아질수록 쿼리 최적화가 어려워질 수 있다.

 

 

 

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

     - 인덱스가 쿼리의 실행에 필요한 모든 정보를 포함하는 경우

     - 별도의 테이블 or 인덱스 풀 스캔을 수행하지 않고도 원하는 결과를 얻을 수 있어서 쿼리의 성능을 향상시킬 수 있다.

 

 

 

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

     - 2개 이상의 열에 대한 인덱스로, 이러한 열들의 조합에 대한 키와 해당 레코드의 위치를 저장하는 DB 인덱스 형태이다.

     - 여러 열을 기반으로 한 검색 및 정렬 작업에서 성능을 향상시킬 수 있다.

     - 각 열에 대한 인덱스뿐만 아니라 해당 열들의 조합에 대한 인덱스도 별도로 생성할 필요가 있다.

 

 

 

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

     *데이터베이스에서 사용되는 인덱스 형태

 

     참고 : B-Tree 개념 정리

     - https://velog.io/@emplam27/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-B-Tree

     - https://ssocoit.tistory.com/217

 

     1) B-Tree 

          ▶ 개념

               - DB에서 사용되는 자료구조 중 하나로, 검색/삽입/삭제 연산을 효율적으로 수행할 수 있도록 설계되었다.

               - 각 노드는 여러 키와 해당 키에 대한 자식 노드를 가지고 있다.

               - 모든 리프 노드가 동일한 레벨에 위치하도록 균형을 유지하며, 특히 범위 검색에 효과적이다.

 

          ▶ 특징

               - 각 노드의 자료는 정렬되어 있다.

               - 자료는 중복되지 않는다.

 

     2) B+Tree 

          ▶ 등장배경

               - B-Tree의 단점 중 하나는 탐색을 위해서 노드를 찾아 이동해야 한다.

               - 같은 레벨의 모든 키 값들이 정렬되어 있고, 같은 레벨의 Sibiling node는 연결리스트 형태로 이어져 있다.

               - 검색속도가 매우 빨라 대부분의 DB시스템에서 적용하고 있는 구조이다.

 

          ▶ 개념

               - B-Tree와 마찬가지로 균형을 유지하면서 연산을 효율적으로 수행한다.

               - 그러나 리프 노드만이 실제 데이터를 가지고 있고, 연결리스트로 연결되어 있어 범위 검색에 더욱 효과적이다.

               - 또한 내부 노드에는 키만 저장되므로 더 많은 키를 담을 수 있다.

 

               - Leaf 아닌 node : 인덱스 노드, Value 값에는 다음 노드를 가리킬 수 있는 포인터 주소가 존재

               - Leaf node : 데이터 노드, Value 값에는 데이터가 존재

 

          ▶ 특징

               - 모든 Leaf node는 연결리스트로 연결되어 있다.

               - Leaf node가 아닌 node의 키 값의 수는 그 노드의 서브트리 수보다 하나가 적다.

               - 키 값이 중복될 수 있다. (인덱스 노드와 데이터 노드에서 동시에 등장 가능)

               - 데이터 검색을 위해서는 반드시 Leaf node까지 내려가야 한다.

탐색 과정 예시 [https://ssocoit.tistory.com/217]

 

 

 

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

     *데이터베이스에서 사용되는 인덱스 형태

 

     1) Hash 인덱스

          - 해시 함수를 이용하여 키와 해당하는 데이터의 위치를 연결하는 구조

          - 입력으로 받은 키를 일정한 크기의 해시 값으로 변환

          - 해시 값은 인덱스의 주소 역할을 하며, 데이터를 빠르게 찾을 수 있다.

 

 

     2) 특징

          - 빠른 검색 : 해시 함수를 통해 고유한 해시 값을 생성, 해당 값으로 직접 접근하여 검색 속도가 매우 빠름

          - 등호(=) 연산에 효과적? : 주로 등호 연산(=)에 대한 검색에서 높은 성능을 발휘, 키가 고르게 분포되어 있는 경우에 효과적

          - 범위 검색 불가능

          - 충돌 : 서로 다른 키가, 같은 해시 값으로 매핑되는 충돌이 발생할 수 있음

 

 

 

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

     1) 클러스터링 인덱스

          - DB 테이블의 레코드들을 특정 열(or 여러 열)의 값에 따라 물리적으로 정렬된 상태로 저장하는 인덱스

 

     2) 특징

          - 특정 범위나 값에 대한 검색이 빠르며, 범위 검색에 특히 효과적이다.

          - 하나의 테이블에는 하나의 클러스터링 인덱스만 설정할 수 있다.

 

 

 

 

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

     *DB에서 인덱스를 활용하여 데이터를 검색하는 방식 중 하나 (WHERE 절의 조건을 만족하는 행)

 

     1) 인덱스 범위 스캔(Range Scan)

          - 특정 범위 내에 있는 인덱스 키 값을 사용하는 방식

          - ex. BETWEEN, < >

 

     2) 인덱스 전체 스캔(Index Full Scan)

          - 인덱스의 전체 키 값을 스캔하여 검색하는 방식

          - 주로 WHERE 조건에 인덱스를 사용하지 않거나 인덱스를 사용할 수 없는 경우에 적용

 

     3) 인덱스 유니크 스캔(Unique Scan)

          - 유니크한 값을 가지는 인덱스에서 검색하는 방식

          - 주로 PK나 유니크 제약이 설정된 열에 대한 검색에 사용

 

 

 

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

     *DB 시스템이 쿼리를 실행하는 방식을 나타내는 계획

 

     1) 쿼리 실행 계획

          - 일반적으로 특정 쿼리를 처리하기 위해 어떤 인덱스 or 테이블 스캔 or 조인 알고리즘을 사용할지 등을 포함한다.

          - DBMS에 따라 다르며, 각 DBMS는 자체적인 최적화 및 실행 계획 생성 방식을 가지고 있다.

 

     2) 실행 계획 확인 경험

          - MySQL에서는 'EXPLAIN SELECT ...' 문을 사용하여 실행 계획을 확인할 수 있다.

 

 

 

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

     *DB 쿼리 옵티마이저에게 쿼리 실행 계획을 조정하거나 특정 방식으로 처리하도록 지시하는 명령이나 주석

 

     1) 힌트(Hint)

          - 일반적으로 SQL 쿼리에 추가되어 DB 옵티마이저가 자동으로 생성하는 실행 계획을 수정하는데 사용한다.

          - 사용하는 것에 주의가 필요하며, 최적의 실행 계획에 대한 믿음이 있을 때에만 사용하는 것이 좋다.

 

     2) 테이블 힌트(Table Hint)

          - 특정 테이블에 대한 접근 방식을 지정한다.

             ex. 인덱스 힌트를 사용하여 어떤 인덱스를 사용해야 하는지 지정할 수 있다.

 

     2) 조인 힌트(Join Hint)

          - 여러 테이블을 조인할 때 사용되며, 옵티마이저가 어떤 조인 방법을 사용해야 하는지 나타낸다.

 

     3) 옵티마이저 힌트(Optimizer Hint)

          - 옵티마이저가 특정 방식으로 쿼리를 처리하도록 하는 힌트로, 특정 알고리즘이나 규칙을 사용하도록 한다.

 

 

 

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

     1) 실행 계획 분석

          - DB에서 제공하는 쿼리 실행 계획을 확인한다.

          - 실행 계획을 통해 인덱스가 어떻게 사용되고 있는지, 어떤 종류의 스캔이 발생했는지 등을 파악할 수 있다.

 

     2) 인덱스 힌트 사용

          - 특정 쿼리에 대해 특정 인덱스를 사용하도록 힌트를 추가하여, 실행 계획을 확인할 수 있다.

          - 이를 통해 다른 인덱스를 사용했을 때와의 성능 차이를 비교할 수 있다.

 

     3) 통계 정보 확인

          - DB는 통계 정보를 유지하고 있다.
          - 이 통계 정보를 확인하여 인덱스의 성능 및 선택도를 분석할 수 있다

 

     4) 인덱스 논리적 일관성 확인

          - 인덱스를 통해 검색하는 쿼리의 결과가 예상과 일치하는지 확인

          - 논리적으로 일관성이 유지되면서도 성능이 향상되는지를 살펴본다.

 

     5) 시간 측정

          - 동일한 쿼리를 실행할 때 인덱스 사용 유무에 따른 실행 시간을 측정하여, 성능을 비교할 수 있다.

 

 

 

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

     1) 너무 많은 인덱스 생성 피하기

 

     2) 인덱스 갱신 비용 고려

         - 인덱스를 갱신하는 작업도 리소스를 소모하므로 고려

         - 자주 갱신되는 컬럼에 대한 인덱스는 성능 저하의 원인이 될 수 있다.

 

     3) 인덱스 결합 고려

         - 여러 개의 인덱스가 필요한 경우, 각 인덱스의 성능과 갱신 비용을 고려하여 효율적으로 결합

 

     4) 인덱스 힌트 사용 주의

         - 힌트를 남용하면 옵티마이저의 역할이 축소될 수 있다.

 

     5) 비정규화 고려

         - 필요에 따라 DB를 비정규화하여 성능을 향상시키는 방법 고려

 

 

 

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

     *GROUP BY를 사용할 때, 인덱스가 효과적으로 걸리는 조건

 

     1) 그룹화할 열에 인덱스가 있는 경우

 

     2) 필터링 조건이 인덱스와 연관되는 경우

 

     3) 인덱스 컬럼과 그룹화 컬럼이 일치하는 경우

 

 

 

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

     1) 단일 열 인덱스

         - 각 열에 대해 단일 열 인덱스를 고려할 수 있다.

CREATE INDEX idx_name ON your_table(name);

 

 

     2) 다중 열 인덱스

         - 여러 열을 함께 사용하는 쿼리가 자주 발생하는 경우,

            해당 열들에 대한 다중 열(복합) 인덱스를 고려할 수 있다.

CREATE INDEX idx_name_country_gender ON your_table(name, country, gender);