프로그래밍

Database Index(MariaDB) 사용

C.Story 2023. 8. 1. 14:31
반응형

1. 인덱스란 

 

인덱스(Index)는 테이블의 검색 속도를 향상시키기 위해 사용되는 자료구조로, 특정 컬럼(또는 컬럼의 조합)의 값을 미리 정렬하여 데이터베이스의 검색 작업을 최적화하는 역할을 합니다.

일반적으로 데이터베이스 테이블에는 많은 레코드(행)들이 저장되어 있고, 이러한 레코드들을 검색하거나 필터링하는 작업은 데이터베이스의 성능에 영향을 미칩니다. 특히 큰 테이블에서 전체 레코드를 스캔하여 검색하거나 조건에 맞는 레코드를 찾는 것은 많은 시간과 자원을 소비하게 됩니다.

이런 문제를 해결하기 위해 인덱스는 특정 컬럼에 대해 미리 정렬된 데이터 구조로 생성됩니다. 이렇게 인덱스가 생성되면, 데이터베이스가 레코드를 검색할 때 모든 레코드를 순차적으로 검색하는 것이 아니라, 인덱스를 사용하여 검색 범위를 좁힐 수 있습니다. 이로 인해 데이터베이스의 검색 성능이 향상되며, 쿼리의 실행 속도가 빨라집니다.

인덱스는 테이블에 대해 여러 개 생성될 수 있으며, 주로 자주 검색되는 컬럼이나 조인 조건으로 사용되는 컬럼에 인덱스를 생성하는 것이 일반적입니다. 그러나 인덱스를 생성할 때에는 인덱스를 관리하는 오버헤드와 추가적인 저장 공간도 고려해야 합니다. 적절하게 인덱스를 선택하고 관리하는 것이 중요합니다.

데이터베이스 인덱스는 데이터베이스의 성능 최적화와 빠른 쿼리 실행을 지원하는 중요한 기술 요소로서, 데이터베이스 설계와 관리에 있어서 핵심 개념 중 하나입니다.

 


2. 인덱스 사용법

 


예를들어 MariaDB에 "Students"라는 이름의 테이블이 있으며, 이 테이블은 학생들의 성적 정보를 저장합니다. "Students" 테이블에는 학번(student_id), 이름(name), 학과(department), 성적(grade) 컬럼이 있다고 가정합니다.

1. 테이블 생성
우선 "Students" 테이블을 생성해보겠습니다.

CREATE TABLE Students (
    student_id INT PRIMARY KEY,
    name VARCHAR(50),
    department VARCHAR(50),
    grade INT
);



2. 인덱스 생성
"Students" 테이블에서 학번(student_id)을 기준으로 자주 검색하는 경우가 많다고 가정하겠습니다. 이제 학번(student_id) 컬럼에 인덱스를 생성해보겠습니다.

CREATE INDEX idx_student_id ON Students(student_id);


복합 인덱스 생성
복합 인덱스는 여러 개의 컬럼으로 구성된 인덱스로, 여러 컬럼에 대한 조합 검색에 유용합니다. 예를 들어, 학생의 학번(student_id)과 학과(department)에 대한 복합 인덱스를 생성하면 학번과 학과를 기준으로 레코드를 검색할 때 성능이 향상될 수 있습니다.

CREATE INDEX idx_student_id_department ON Students(student_id, department);


3. 인덱스 사용
이제 학번(student_id)을 기준으로 특정 학생을 검색하는 쿼리를 실행해보겠습니다.

SELECT * FROM Students WHERE student_id = 2023001;

인덱스가 생성되어 있다면 데이터베이스는 인덱스를 사용하여 해당 학번에 맞는 레코드를 더 빠르게 찾습니다.

4. 인덱스의 삭제
인덱스가 더 이상 필요하지 않을 경우에는 삭제하는 것이 좋습니다. 인덱스를 삭제하려면 `DROP INDEX` 문을 사용합니다.

DROP INDEX idx_student_id ON Students;

위 명령은 "Students" 테이블에서 "idx_student_id"라는 이름의 인덱스를 삭제합니다.

5. 인덱스의 동작 원리
MariaDB에서의 인덱스 동작은 MySQL과 유사합니다. 인덱스는 B-tree나 Hash 등의 자료구조를 사용하여 구현될 수 있으며, 기본적으로 B-tree 인덱스가 가장 많이 사용됩니다. 학번(student_id) 컬럼에 인덱스를 생성하면, MariaDB는 학번을 기준으로 정렬된 인덱스 트리를 만들어 둡니다. 이렇게 인덱스를 사용하면 데이터베이스가 레코드를 찾을 때 전체 테이블을 순차적으로 검색하는 것이 아니라, 인덱스를 사용하여 검색 범위를 좁힐 수 있으므로 검색 성능이 향상됩니다.

6. 인덱스의 장단점
MariaDB에서의 인덱스 장단점은 일반적인 데이터베이스 인덱스의 장단점과 동일합니다. 자주 사용되는 컬럼이나 조건절에서 사용되는 컬럼에 인덱스를 생성하면 검색 성능이 향상되지만, 인덱스를 관리하고 갱신하는 데에 추가적인 오버헤드가 발생할 수 있습니다. 적절한 인덱스를 선택하고 관리하는 것이 중요합니다.

위 예제를 통해 MariaDB에서의 인덱스 동작과 활용에 대해 간단히 설명해 드렸습니다. 실제 상황에서는 데이터베이스 스키마와 쿼리 패턴에 따라 인덱스를 효과적으로 사용하여 성능을 최적화하는 것이 중요합니다.

 


3. 인덱스 성능

 

인덱스의 성능 측정은 데이터베이스 성능 최적화를 위해 매우 중요한 과정입니다. 인덱스를 효과적으로 사용하여 쿼리의 실행 성능을 개선하려면 쿼리 실행 계획을 분석하고 적절한 성능 측정을 수행해야 합니다. 인덱스의 성능을 측정하는 주요 방법과 몇 가지 유용한 도구에 대해 설명하겠습니다.

1. 실행 계획 분석
데이터베이스에서는 쿼리 실행 계획을 통해 인덱스가 어떻게 사용되고 있는지를 확인할 수 있습니다. 대부분의 데이터베이스는 `EXPLAIN`이라는 명령을 제공하여 쿼리 실행 계획을 조회할 수 있습니다. 실행 계획에서는 쿼리가 어떤 인덱스를 사용하는지, 테이블에 대해 어떤 순서로 접근하는지, 어떤 유형의 조인이 수행되는지 등을 확인할 수 있습니다.

2. 인덱스 통계 분석
인덱스는 데이터의 분포에 따라 성능에 영향을 받습니다. 인덱스의 통계 정보를 분석하여 인덱스의 효율성을 평가할 수 있습니다. 특히, 인덱스의 선택도(Selectivity)를 확인하여 인덱스를 효과적으로 사용하는지를 판단할 수 있습니다.

3. 성능 측정 도구
데이터베이스 성능 측정에는 다양한 도구들이 있습니다. 대표적으로 아래와 같은 도구들이 있습니다.
   - MySQL의 `EXPLAIN` 명령: 이미 언급한 것처럼 쿼리 실행 계획을 확인할 수 있습니다.
   - MySQL의 `SHOW INDEX` 명령: 테이블의 인덱스 정보를 조회할 수 있습니다.
   - MariaDB의 `ANALYZE TABLE` 명령: 테이블의 인덱스 통계 정보를 갱신합니다.
   - Percona Toolkit: MySQL과 MariaDB의 성능 측정 및 최적화를 위한 유용한 도구 모음입니다.

4. 성능 튜닝
인덱스의 성능 측정을 통해 인덱스가 적절하게 활용되고 있는지를 확인한 후, 필요에 따라 인덱스를 추가, 수정, 삭제하는 등의 작업을 수행하여 성능을 튜닝할 수 있습니다. 쿼리의 실행 계획을 분석하고 인덱스의 선택도를 확인하여 인덱스를 적절하게 관리하는 것이 중요합니다.

성능 측정 결과를 사용하여 데이터베이스 스키마와 쿼리를 최적화하고, 데이터베이스의 부하를 분산시키는 등의 작업을 통해 데이터베이스의 성능을 최적화할 수 있습니다. 이를 통해 사용자들에게 빠른 응답 시간과 원활한 서비스를 제공할 수 있습니다. 하지만 성능 측정은 정기적으로 수행하여 데이터베이스 환경의 변화나 데이터 성격의 변화에 따라 성능을 모니터링하는 것이 중요합니다.

 


데이터베이스 인덱스에 대해 이해하고 활용하는 방법에 대해 알려드렸습니다. 인덱스는 데이터베이스 성능 최적화에 중요한 역할을 하며, 쿼리의 실행 속도를 향상시키는 데에 큰 도움이 됩니다.

데이터베이스 인덱스를 적절하게 설계하고 사용하는 것은 데이터베이스 애플리케이션의 성능을 개선하는 데에 필수적입니다. 하지만 인덱스를 관리하는 데에는 추가적인 오버헤드가 발생할 수 있으므로, 필요한 인덱스를 선별하고 효과적으로 사용하는 것이 중요합니다.

더 나은 성능과 최적화된 데이터베이스 구조를 위해 인덱스에 대한 이해를 바탕으로 적절한 인덱스를 선택하고 데이터베이스 설계를 수행해 보시기 바랍니다.

감사합니다!

반응형

'프로그래밍' 카테고리의 다른 글

INNER JOIN, LEFT JOIN, RIGHT JOIN 설명  (0) 2023.08.01