데이터베이스 인덱스는 테이블의 데이터 검색 속도를 높이기 위해 사용하는 데이터 구조이다. 인덱스는 책의 색인처럼 동작하여, 데이터베이스가 특정 데이터를 더 빨리 찾을 수 있도록 돕는다. 이 글에서는 인덱스의 개념, 종류, 생성 방법, 인덱스 생성 과정, DML(데이터 조작 언어) 작업 시 인덱스의 역할, 장단점, 그리고 인덱스 사용 시 주의사항에 대해 설명한다.
인덱스는 데이터베이스 테이블의 하나 이상의 열(Column)에 대한 포인터 목록이다. 인덱스는 테이블에서 데이터를 빠르게 검색할 수 있도록 설계되었으며, 각 인덱스 항목에는 인덱스된 데이터와 해당 데이터가 저장된 실제 행(Row)을 가리키는 포인터가 포함된다.
예를 들어, Employees
테이블에서 EmployeeID
열에 인덱스를 생성하면, 데이터베이스는 해당 열을 검색할 때 인덱스를 사용하여 검색 속도를 크게 향상시킬 수 있다.
B-Tree 인덱스
해시 인덱스
비트맵 인덱스
함수 기반 인덱스
LOWER()
함수를 사용할 수 있다.인덱스를 생성하면 데이터베이스 시스템은 다음과 같은 과정을 거친다:
DML(데이터 조작 언어) 작업에는 삽입(INSERT), 갱신(UPDATE), 삭제(DELETE) 작업이 포함된다. 각 작업이 인덱스에 미치는 영향은 다음과 같다:
새로운 데이터를 테이블에 삽입할 때, 해당 데이터가 인덱스 열에 포함되어 있다면, 인덱스도 함께 갱신된다.
INSERT INTO Employees (EmployeeID, EmployeeName, DepartmentID)
VALUES (1, 'John Doe', 101);
위 삽입 작업이 수행되면, EmployeeID
인덱스에 새로운 항목이 추가된다.
인덱스 열이 포함된 데이터를 갱신할 때, 인덱스도 함께 갱신된다. 만약 인덱스 열의 값이 변경되면, 인덱스에서 해당 항목이 삭제되고, 새로운 값으로 다시 삽입된다.
UPDATE Employees
SET EmployeeID = 2
WHERE EmployeeID = 1;
위 갱신 작업이 수행되면, 기존 EmployeeID
1인 항목이 인덱스에서 삭제되고, 새로운 EmployeeID
2인 항목이 인덱스에 추가된다.
데이터를 삭제할 때, 해당 데이터가 포함된 인덱스 항목도 함께 삭제된다.
DELETE FROM Employees
WHERE EmployeeID = 2;
위 삭제 작업이 수행되면, EmployeeID
2인 항목이 인덱스에서 삭제된다.
-- 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;
-- 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;
-- 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;
인덱스는 데이터베이스에서 중요한 성능 최적화 도구이다. 적절하게 사용하면 데이터 검색 속도를 크게 향상시킬 수 있지만, 잘못 사용하면 오히려 성능 저하와 관리 복잡성을 초래할 수 있다. 인덱스의 특성과 사용 사례를 잘 이해하고, 적절한 전략을 통해 효율적인 데이터베이스 운영을 도모하는 것이 중요하다.