📘 3-3. 다양한 인덱스 종류와 최적화
인덱스는 데이터베이스 성능을 최적화하는 데 중요한 역할을 합니다. 쿼리 실행 시, 데이터베이스는 인덱스를 사용하여 검색 속도를 빠르게 할 수 있으며, 이는 대규모 데이터셋에서 특히 중요합니다. 이번 포스팅에서는 MySQL에서 사용되는 다양한 인덱스 종류와 이를 효과적으로 활용하는 방법을 살펴보겠습니다.
📌 1. 인덱스란?
인덱스는 데이터베이스 테이블의 검색 속도를 빠르게 하기 위한 데이터 구조입니다. 책에서 찾고자 하는 단어의 페이지 번호를 미리 정리한 목차와 비슷한 역할을 합니다. 인덱스를 사용하면, 전체 테이블을 검색하는 것보다 더 빠르게 데이터를 찾을 수 있습니다.
📌 2. MySQL의 인덱스 종류
MySQL에서 제공하는 다양한 인덱스 종류는 다음과 같습니다:
1. 기본 인덱스 (Single Column Index)
기본 인덱스는 하나의 컬럼에만 적용되는 인덱스입니다. 이 인덱스는 주로 자주 검색되거나 정렬되는 컬럼에 적용합니다. 예를 들어, 이메일 주소를 검색하는 쿼리에서 이메일 컬럼에 인덱스를 추가하면 성능이 향상됩니다.
CREATE INDEX idx_email ON users(email);
2. 복합 인덱스 (Composite Index)
복합 인덱스는 두 개 이상의 컬럼을 결합하여 만든 인덱스입니다. 복합 인덱스는 여러 컬럼을 동시에 검색할 때 효율적입니다. 예를 들어, first_name
과 last_name
을 동시에 검색하는 쿼리가 자주 사용된다면 두 컬럼에 복합 인덱스를 적용할 수 있습니다.
CREATE INDEX idx_name ON users(first_name, last_name);
주의사항: 복합 인덱스는 왼쪽에서 오른쪽으로 순차적으로 검색하는 방식이므로, 검색할 컬럼이 복합 인덱스에서 첫 번째 컬럼일 경우에만 인덱스가 사용됩니다.
3. 유니크 인덱스 (Unique Index)
유니크 인덱스는 인덱스를 생성하는 동시에 해당 컬럼의 값이 중복되지 않도록 제한하는 역할도 합니다. 일반적으로 PRIMARY KEY
와 UNIQUE
제약 조건을 추가할 때 사용됩니다. 유니크 인덱스를 사용하면 중복 데이터를 방지하고 검색 성능을 향상시킬 수 있습니다.
CREATE UNIQUE INDEX idx_unique_email ON users(email);
4. 전체 텍스트 인덱스 (Full-text Index)
전체 텍스트 인덱스는 긴 텍스트를 검색할 때 사용됩니다. MySQL에서 제공하는 FULLTEXT
인덱스는 텍스트 검색을 빠르게 처리합니다. 일반적으로 CHAR
, VARCHAR
, TEXT
데이터 타입에 사용할 수 있습니다.
CREATE FULLTEXT INDEX idx_text_search ON articles(content);
전체 텍스트 인덱스를 사용하면 텍스트 검색 쿼리에서 MATCH ... AGAINST
구문을 사용하여 효율적으로 검색할 수 있습니다.
5. 공간 인덱스 (Spatial Index)
공간 인덱스는 공간 데이터나 지리적 데이터에 대해 검색을 최적화하는 인덱스입니다. MySQL에서는 SPATIAL
인덱스를 사용하여 지리적 데이터를 다룰 때 성능을 향상시킬 수 있습니다.
CREATE SPATIAL INDEX idx_location ON places(location);
📌 3. 인덱스 최적화 방법
인덱스를 잘 활용하면 쿼리 성능을 크게 향상시킬 수 있지만, 인덱스를 과도하게 사용하면 오히려 성능을 저하시킬 수 있습니다. 다음은 인덱스를 최적화하는 방법입니다:
1. 자주 조회되는 컬럼에 인덱스 추가
자주 검색하거나 정렬되는 컬럼에 인덱스를 추가하여 검색 속도를 개선합니다. 예를 들어, WHERE
절에 자주 등장하는 컬럼, ORDER BY
절에 자주 등장하는 컬럼에 인덱스를 추가하면 성능이 향상됩니다.
2. 복합 인덱스를 사용할 때 순서에 주의
복합 인덱스는 인덱스에 포함된 컬럼들의 순서에 따라 성능이 달라질 수 있습니다. 인덱스의 첫 번째 컬럼은 검색 조건에서 가장 자주 사용되는 컬럼이어야 하며, 두 번째 컬럼은 두 번째로 자주 사용되는 컬럼이어야 합니다.
3. 불필요한 인덱스 제거
인덱스는 디스크 공간을 차지하고, 데이터 수정 시에도 성능에 영향을 미칩니다. 불필요한 인덱스를 제거하여 디스크 공간을 절약하고, 쿼리 성능을 최적화할 수 있습니다.
DROP INDEX idx_email ON users;
4. 인덱스 재구성 및 최적화
대규모 데이터베이스에서는 인덱스가 조각화되어 성능이 저하될 수 있습니다. 이 경우, OPTIMIZE TABLE
명령어를 사용하여 테이블을 최적화하고 인덱스를 재구성할 수 있습니다.
OPTIMIZE TABLE users;
5. 분할 테이블을 고려
매우 큰 테이블의 경우, 테이블을 분할하여 인덱스를 효율적으로 관리하는 방법도 고려할 수 있습니다. 파티셔닝을 사용하면 데이터가 나누어져 더 효율적인 인덱스 및 쿼리 성능을 얻을 수 있습니다.
📌 4. 인덱스 활용 예제
인덱스를 활용한 쿼리 최적화 예제는 다음과 같습니다:
1. 인덱스 활용 전
SELECT * FROM orders WHERE customer_id = 12345;
위 쿼리는 customer_id
에 인덱스가 없다면 전체 테이블을 스캔하게 되어 성능이 매우 저하될 수 있습니다.
2. 인덱스 추가 후
CREATE INDEX idx_customer_id ON orders(customer_id);
SELECT * FROM orders WHERE customer_id = 12345;
인덱스를 추가하면, 이제 데이터베이스는 빠르게 해당 customer_id
값을 찾을 수 있으며, 성능이 크게 향상됩니다.
📚 다음 글 예고
다음 포스팅에서는 3-4. 쿼리 캐시 활용법에 대해 다루겠습니다. 쿼리 캐시를 통해 자주 실행되는 쿼리의 성능을 어떻게 최적화할 수 있는지에 대해 알아보겠습니다.
'DB 데이터 > 인덱스 & 성능 최적화' 카테고리의 다른 글
데이터베이스 파티셔닝 활용법 (0) | 2025.05.15 |
---|---|
쿼리 캐시 활용법 (1) | 2025.05.14 |
쿼리 성능 분석 및 실행 계획 (EXPLAIN) (0) | 2025.05.12 |
MySQL 인덱스 기본 개념 및 활용 (1) | 2025.05.11 |