DB 데이터/인덱스 & 성능 최적화

MySQL 인덱스 기본 개념 및 활용

backend.log 2025. 5. 11. 18:08
728x90
반응형

📘 3-1. MySQL 인덱스 기본 개념 및 활용

MySQL에서 인덱스는 데이터베이스 성능을 최적화하는 데 중요한 역할을 합니다. 인덱스는 데이터를 빠르게 검색할 수 있도록 돕는 데이터 구조로, 일반적으로 검색, 정렬, 그룹화 등의 작업을 빠르게 수행할 수 있게 합니다. 이번 포스팅에서는 MySQL 인덱스의 기본 개념과 활용 방법을 자세히 알아보겠습니다.

📌 인덱스란?

인덱스는 책의 목차처럼, 데이터베이스 테이블의 데이터를 빠르게 찾을 수 있도록 도와주는 자료구조입니다. 인덱스는 주로 B-Tree 또는 Hash 기반으로 구현되며, 테이블의 특정 열에 대해 빠른 검색을 가능하게 합니다.

📌 인덱스의 역할

  • 검색 속도 향상: WHERE 절에서 조건을 만족하는 행을 빠르게 찾을 수 있도록 도와줍니다.
  • 정렬 속도 향상: ORDER BY 또는 GROUP BY를 사용할 때, 인덱스가 있으면 성능이 크게 개선됩니다.
  • 중복 데이터 제거: 유니크 인덱스를 사용하면 중복 데이터를 방지할 수 있습니다.
  • 조인 성능 향상: 여러 테이블을 조인할 때, 인덱스를 활용하면 성능을 크게 향상시킬 수 있습니다.

📌 인덱스의 종류

MySQL에서는 다양한 종류의 인덱스를 제공하며, 각 인덱스는 특정 상황에서 성능을 최적화하는 데 사용됩니다.

  • 기본 인덱스 (Index): 가장 기본적인 인덱스로, PRIMARY KEYUNIQUE 제약이 없는 열에 사용됩니다.
  • 유니크 인덱스 (UNIQUE Index): 중복된 값이 들어가는 것을 방지하는 인덱스입니다. PRIMARY KEY는 유니크 인덱스를 자동으로 생성합니다.
  • 복합 인덱스 (Composite Index): 여러 열을 결합한 인덱스로, 복수의 열을 대상으로 검색할 때 성능을 향상시킵니다.
  • 풀텍스트 인덱스 (FULLTEXT Index): 텍스트 기반의 검색을 최적화하는 인덱스로, TEXTVARCHAR와 같은 텍스트 컬럼에 대해 검색 성능을 높입니다.
  • 비트맵 인덱스 (Bitmap Index): 데이터가 적고, 열 값이 적을 때 유용합니다. 주로 읽기 전용 시스템에서 사용됩니다.

📌 인덱스 생성 및 활용

인덱스는 데이터베이스 테이블에서 중요한 역할을 하지만, 너무 많은 인덱스를 생성하면 INSERT, UPDATE, DELETE 작업에 성능 저하를 일으킬 수 있습니다. 따라서 적절하게 인덱스를 설계하는 것이 중요합니다.

✅ 인덱스 생성

인덱스를 생성하는 기본 문법은 다음과 같습니다:

CREATE INDEX index_name ON table_name (column_name);

예를 들어, users 테이블에서 email 열에 인덱스를 생성하려면:

CREATE INDEX idx_email ON users (email);

✅ 복합 인덱스 생성

복합 인덱스는 여러 열을 결합하여 인덱스를 생성할 수 있습니다. 예를 들어, first_namelast_name 두 열에 대해 검색 성능을 향상시키려면:

CREATE INDEX idx_name ON users (first_name, last_name);

✅ 유니크 인덱스 생성

유니크 인덱스는 중복 값을 방지하기 위해 사용됩니다. 예를 들어, users 테이블의 email 열에 대해 유니크 인덱스를 생성하려면:

CREATE UNIQUE INDEX idx_unique_email ON users (email);

📌 인덱스의 성능 영향

인덱스는 데이터 검색 속도를 향상시키지만, 인덱스를 만들거나 갱신하는 데 드는 비용이 발생합니다. 특히 다음과 같은 작업에서는 성능 저하를 초래할 수 있습니다:

  • INSERT, UPDATE, DELETE: 데이터를 삽입하거나 수정할 때마다 인덱스를 갱신해야 하므로, 이러한 작업에서 성능이 저하될 수 있습니다.
  • 불필요한 인덱스: 사용되지 않는 인덱스가 많으면, 쿼리 최적화가 어려워지고 성능이 떨어질 수 있습니다.

따라서 인덱스는 필요할 때만 적절히 사용해야 합니다.

📌 인덱스 활용 예시

✅ 단일 인덱스 활용 예시

사용자의 email로 데이터를 빠르게 조회하려면:

SELECT * FROM users WHERE email = 'test@example.com';

위와 같은 쿼리에서는 email 열에 인덱스가 있으면 성능이 크게 향상됩니다.

✅ 복합 인덱스 활용 예시

여러 조건을 동시에 사용할 때 복합 인덱스를 활용하여 성능을 최적화할 수 있습니다. 예를 들어:

SELECT * FROM orders WHERE status = 'completed' AND user_id = 123;

위 쿼리에서 statususer_id 두 열에 복합 인덱스를 생성하면 성능이 개선됩니다.

💡 실무 팁

  • 테이블에 인덱스를 생성할 때는 자주 사용되는 검색 조건이나 조인에 사용되는 열에 인덱스를 적용하는 것이 좋습니다.
  • 복합 인덱스는 쿼리에서 자주 사용되는 조건의 순서대로 생성해야 성능을 최적화할 수 있습니다.
  • 인덱스의 갯수가 많을수록 디스크 사용량이 증가하고, 인덱스를 갱신하는 데 시간이 걸리므로, 최소한으로 사용하는 것이 좋습니다.

📚 다음 글 예고

다음 포스팅에서는 3-2. 쿼리 성능 분석 및 실행 계획 (EXPLAIN)을 다루어, 쿼리 성능을 분석하고 병목을 찾는 방법을 자세히 설명합니다. 쿼리 최적화를 위한 필수 기술이니 많은 기대 부탁드립니다!

728x90
반응형