데이터베이스의 인덱스

023·2024년 6월 30일
0

database

목록 보기
2/8
post-thumbnail

데이터베이스 인덱스 (Database Index)

데이터베이스 인덱스는 테이블의 데이터 검색 속도를 높이기 위해 사용하는 데이터 구조이다. 인덱스는 책의 색인처럼 동작하여, 데이터베이스가 특정 데이터를 더 빨리 찾을 수 있도록 돕는다. 이 글에서는 인덱스의 개념, 종류, 생성 방법, 인덱스 생성 과정, DML(데이터 조작 언어) 작업 시 인덱스의 역할, 장단점, 그리고 인덱스 사용 시 주의사항에 대해 설명한다.


인덱스의 개념

인덱스는 데이터베이스 테이블의 하나 이상의 열(Column)에 대한 포인터 목록이다. 인덱스는 테이블에서 데이터를 빠르게 검색할 수 있도록 설계되었으며, 각 인덱스 항목에는 인덱스된 데이터와 해당 데이터가 저장된 실제 행(Row)을 가리키는 포인터가 포함된다.

예를 들어, Employees 테이블에서 EmployeeID 열에 인덱스를 생성하면, 데이터베이스는 해당 열을 검색할 때 인덱스를 사용하여 검색 속도를 크게 향상시킬 수 있다.


인덱스의 종류

  1. B-Tree 인덱스

    • 가장 일반적인 인덱스 유형.
    • 균형 트리 구조를 사용하여 데이터 검색, 삽입, 삭제 성능을 최적화한다.
  2. 해시 인덱스

    • 해시 테이블을 기반으로 한 인덱스.
    • 정확한 일치 검색에 유리하지만 범위 검색에는 적합하지 않다.
  3. 비트맵 인덱스

    • 비트맵을 사용하여 값을 인덱싱.
    • 주로 데이터가 비교적 적고 값의 종류가 한정적인 경우 사용.
  4. 함수 기반 인덱스

    • 특정 함수나 표현식을 기준으로 인덱스를 생성.
    • 예를 들어, 대소문자를 구분하지 않는 검색을 위해 LOWER() 함수를 사용할 수 있다.

인덱스 생성 과정

인덱스를 생성하면 데이터베이스 시스템은 다음과 같은 과정을 거친다:

  1. 인덱스 구조 초기화: 데이터베이스 시스템은 인덱스의 타입(B-Tree, 해시 등)에 따라 적절한 데이터 구조를 초기화한다.
  2. 데이터 정렬: 테이블의 데이터를 인덱스 열 기준으로 정렬한다.
  3. 인덱스 항목 생성: 각 행의 인덱스 열 값을 사용하여 인덱스 항목을 생성하고, 해당 데이터 행의 포인터를 저장한다.
  4. 인덱스 저장: 생성된 인덱스 구조를 디스크에 저장한다.

DML 작업 시 인덱스의 역할

DML(데이터 조작 언어) 작업에는 삽입(INSERT), 갱신(UPDATE), 삭제(DELETE) 작업이 포함된다. 각 작업이 인덱스에 미치는 영향은 다음과 같다:

삽입 (INSERT)

새로운 데이터를 테이블에 삽입할 때, 해당 데이터가 인덱스 열에 포함되어 있다면, 인덱스도 함께 갱신된다.

INSERT INTO Employees (EmployeeID, EmployeeName, DepartmentID)
VALUES (1, 'John Doe', 101);

위 삽입 작업이 수행되면, EmployeeID 인덱스에 새로운 항목이 추가된다.

갱신 (UPDATE)

인덱스 열이 포함된 데이터를 갱신할 때, 인덱스도 함께 갱신된다. 만약 인덱스 열의 값이 변경되면, 인덱스에서 해당 항목이 삭제되고, 새로운 값으로 다시 삽입된다.

UPDATE Employees
SET EmployeeID = 2
WHERE EmployeeID = 1;

위 갱신 작업이 수행되면, 기존 EmployeeID 1인 항목이 인덱스에서 삭제되고, 새로운 EmployeeID 2인 항목이 인덱스에 추가된다.

삭제 (DELETE)

데이터를 삭제할 때, 해당 데이터가 포함된 인덱스 항목도 함께 삭제된다.

DELETE FROM Employees
WHERE EmployeeID = 2;

위 삭제 작업이 수행되면, EmployeeID 2인 항목이 인덱스에서 삭제된다.


인덱스의 장단점

장점

  1. 검색 속도 향상: 인덱스를 사용하면 데이터 검색 속도가 크게 향상된다.
  2. 정렬 속도 향상: 인덱스를 사용하면 데이터 정렬이 빨라진다.
  3. 중복 방지: 고유 인덱스를 사용하면 특정 열에서 중복 값을 방지할 수 있다.

단점

  1. 저장 공간 증가: 인덱스를 생성하면 추가적인 저장 공간이 필요하다.
  2. 쓰기 작업 속도 저하: 데이터 삽입, 수정, 삭제 작업 시 인덱스를 갱신해야 하므로 성능이 저하될 수 있다.
  3. 복잡성 증가: 너무 많은 인덱스를 사용하면 관리가 복잡해지고, 최적화가 어려워질 수 있다.

인덱스 사용 시 주의사항

  1. 적절한 열 선택: 자주 검색되거나 조인에 사용되는 열에 인덱스를 생성하는 것이 좋다.
  2. 인덱스 과다 생성 피하기: 너무 많은 인덱스는 성능을 저하시키고 관리 비용을 증가시킨다.
  3. 정기적인 모니터링: 인덱스의 사용 여부를 모니터링하여 불필요한 인덱스를 제거하고, 필요한 인덱스를 최적화한다.
  4. 인덱스 재구성: 데이터베이스가 커지면서 인덱스의 효율이 떨어질 수 있으므로 정기적으로 인덱스를 재구성하거나 재구축해야 한다.

예제 코드

Oracle

-- Employees 테이블 생성
CREATE TABLE Employees (
    EmployeeID NUMBER PRIMARY KEY,
    EmployeeName VARCHAR2(50),
    DepartmentID NUMBER
);

-- EmployeeID에 인덱스 생성
CREATE INDEX idx_employee_id ON Employees (EmployeeID);

-- DepartmentID에 비트맵 인덱스 생성
CREATE BITMAP INDEX idx_department_id ON Employees (DepartmentID);

-- 데이터 삽입
INSERT INTO Employees (EmployeeID, EmployeeName, DepartmentID)
VALUES (1, 'John Doe', 101);

-- 데이터 갱신
UPDATE Employees
SET EmployeeID = 2
WHERE EmployeeID = 1;

-- 데이터 삭제
DELETE FROM Employees
WHERE EmployeeID = 2;

MySQL

-- Employees 테이블 생성
CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    EmployeeName VARCHAR(50),
    DepartmentID INT
);

-- EmployeeID에 인덱스 생성
CREATE INDEX idx_employee_id ON Employees (EmployeeID);

-- DepartmentID에 해시 인덱스 생성
CREATE INDEX idx_department_id USING HASH ON Employees (DepartmentID);

-- 데이터 삽입
INSERT INTO Employees (EmployeeID, EmployeeName, DepartmentID)
VALUES (1, 'John Doe', 101);

-- 데이터 갱신
UPDATE Employees
SET EmployeeID = 2
WHERE EmployeeID = 1;

-- 데이터 삭제
DELETE FROM Employees
WHERE EmployeeID = 2;

SQL Server

-- Employees 테이블 생성
CREATE TABLE Employees (
    EmployeeID INT PRIMARY KEY,
    EmployeeName NVARCHAR(50),
    DepartmentID INT
);

-- EmployeeID에 인덱스 생성
CREATE INDEX idx_employee_id ON Employees (EmployeeID);

-- DepartmentID에 필터링된 인덱스 생성
CREATE INDEX idx_department_id ON Employees (DepartmentID) WHERE DepartmentID IS NOT NULL;

-- 데이터 삽입
INSERT INTO Employees (EmployeeID, EmployeeName, DepartmentID)
VALUES (1, 'John Doe', 101);

-- 데이터 갱신
UPDATE Employees
SET EmployeeID = 2
WHERE EmployeeID = 1;

-- 데이터 삭제
DELETE FROM Employees
WHERE EmployeeID = 2;

결론

인덱스는 데이터베이스에서 중요한 성능 최적화 도구이다. 적절하게 사용하면 데이터 검색 속도를 크게 향상시킬 수 있지만, 잘못 사용하면 오히려 성능 저하와 관리 복잡성을 초래할 수 있다. 인덱스의 특성과 사용 사례를 잘 이해하고, 적절한 전략을 통해 효율적인 데이터베이스 운영을 도모하는 것이 중요하다.

profile
Get your hands dirty

0개의 댓글