인덱스는 데이터베이스 엔진이 데이터를 빠르게 검색하기 위해 사용하는 특별한 조회 테이블입니다. 책의 뒤쪽에 있는 색인(index)처럼, 인덱스는 원하는 데이터를 빠르게 찾을 수 있게 도와줍니다. 데이터베이스에서는 인덱스가 테이블의 데이터를 가리키는 포인터 역할을 하여, SELECT 쿼리와 WHERE 절의 성능을 크게 향상시킵니다.
인덱스는 데이터베이스의 성능을 크게 향상시킬 수 있지만, 몇 가지 단점도 있습니다
CREATE INDEX 구문을 사용하여 테이블에 인덱스를 생성할 수 있습니다. 기본 구문은 다음과 같습니다
CREATE INDEX index_name ON table_name (column_name);
여기서 인덱스의 이름, 테이블, 인덱스를 생성할 열(column) 등을 지정할 수 있습니다.
PostgreSQL은 다양한 유형의 인덱스를 제공합니다. 각 인덱스는 특정 유형의 쿼리에 적합한 알고리즘을 사용합니다
단일 컬럼 인덱스는 하나의 특정 열에 대해 생성되는 인덱스입니다. 자주 필터링하거나 정렬하는 열에 유용합니다.
장점:
사용 상황:
CREATE INDEX index_name ON table_name (column_name);
다중 컬럼 인덱스는 두 개 이상의 열에 대해 생성되는 인덱스입니다. 여러 열을 기준으로 자주 필터링하거나 정렬할 때 유용합니다.
장점:
사용 상황:
CREATE INDEX index_name ON table_name (column1_name, column2_name);
고려 사항: 쿼리에서 여러 열을 기준으로 필터링할 경우, 다중 컬럼 인덱스를 사용하면 성능이 크게 향상될 수 있습니다.
유니크 인덱스는 인덱스가 적용된 열에 중복된 값이 들어가는 것을 방지합니다. 유니크 제약 조건과 유사하지만, 쿼리 성능도 개선됩니다.
장점:
사용 상황:
CREATE UNIQUE INDEX index_name ON table_name (column_name);
부분 인덱스는 테이블의 특정 부분에만 적용되는 인덱스입니다. 조건식을 사용하여 인덱스가 적용될 데이터를 지정할 수 있습니다.
장점:
CREATE INDEX index_name ON table_name (column_name) WHERE condition;
CREATE INDEX active_users_index ON users (email) WHERE status = 'active';
암시적 인덱스는 기본 키나 유니크 제약 조건을 생성할 때 데이터베이스가 자동으로 생성하는 인덱스입니다. 사용자가 명시적으로 생성하지 않아도 됩니다.
장점:
사용 상황:
PostgreSQL에서 테이블의 모든 인덱스를 조회하려면 \d table_name 명령어를 사용합니다. 이는 인덱스와 테이블의 다른 정보를 보여줍니다.
# \d company
데이터베이스 전체의 인덱스를 조회하려면 다음 명령어를 사용
# \di
더 이상 필요하지 않은 인덱스는 삭제할 수 있습니다. 그러나 인덱스를 삭제하면 그 인덱스가 최적화하던 쿼리 성능이 저하될 수 있으므로 주의해야 합니다.
DROP INDEX index_name;
DROP INDEX salary_index;
인덱스는 쿼리 성능을 향상시키지만, 항상 유용한 것은 아닙니다. 다음과 같은 경우에는 인덱스 사용을 재고할 필요가 있습니다
이제 실제로 테이블을 생성하고 데이터를 삽입한 후, 다양한 인덱스를 적용해 보겠습니다.
-- 1. COMPANY 테이블 생성
CREATE TABLE COMPANY (
ID SERIAL PRIMARY KEY,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
-- 2. 데이터 삽입
INSERT INTO COMPANY (NAME, AGE, ADDRESS, SALARY)
VALUES ('John', 28, 'New York', 45000.00);
INSERT INTO COMPANY (NAME, AGE, ADDRESS, SALARY)
VALUES ('Anna', 24, 'California', 52000.00);
INSERT INTO COMPANY (NAME, AGE, ADDRESS, SALARY)
VALUES ('Mike', 32, 'Texas', 60000.00);
INSERT INTO COMPANY (NAME, AGE, ADDRESS, SALARY)
VALUES ('Sara', 29, 'Florida', 70000.00);
-- 3. SALARY 컬럼에 인덱스 생성
CREATE INDEX salary_index ON COMPANY (SALARY);
-- 4. NAME 컬럼에 유니크 인덱스 생성
CREATE UNIQUE INDEX name_unique_index ON COMPANY (NAME);
-- 5. AGE가 30 이상인 행에만 인덱스 생성 (부분 인덱스)
CREATE INDEX age_above_30_index ON COMPANY (AGE) WHERE AGE >= 30;
-- 6. 인덱스 목록 조회
\d company
-- 7. 인덱스 삭제
DROP INDEX salary_index;
이러한 SQL 코드를 통해 테이블을 생성하고, 데이터를 삽입한 뒤 다양한 인덱스를 적용할 수 있습니다. 각 인덱스는 특정 쿼리의 성능을 최적화하는 데 도움이 됩니다.
이 블로그 포스트에서는 PostgreSQL에서 제공하는 다양한 인덱스의 장점과 사용 상황을 설명했습니다. 올바른 인덱스를 사용하면 데이터베이스 성능을 크게 향상시킬 수 있지만, 잘못 사용하면 성능 저하를 초래할 수 있습니다. 각 인덱스의 특성을 이해하고 상황에 맞게 활용하여 데이터베이스의 최적화를 이루어보세요!