database

index 에 관하여

heejunp 2025. 2. 22. 08:14

데이터베이스에서 인덱싱 (Indexing) 은 데이터 검색 속도를 향상시키는 핵심적인 최적화 기법입니다. 특히, 대량의 데이터를 효율적으로 관리하고 빠르게 조회하는 데 필수적인 기술입니다. 이 글에서는 데이터베이스 인덱싱의 개념과 MySQL에서 인덱스를 생성하고 활용하는 방법을 살펴보겠습니다.


1. 데이터베이스 인덱싱이란?

데이터베이스 인덱스(Index)는 특정 열(Column)에 대한 검색 성능을 최적화하는 자료구조입니다. 인덱스를 사용하면 쿼리 실행 시 테이블을 전체 검색(Full Table Scan)하지 않고, 필요한 데이터만 빠르게 조회할 수 있습니다.

1.1 인덱스의 기본 개념

  • 인덱스는 데이터베이스에서 테이블의 특정 컬럼을 기반으로 생성된 추가적인 자료구조입니다.
  • 마치 책의 목차처럼 동작하며, 특정 데이터를 검색할 때 더 빠른 접근을 가능하게 합니다.
  • 데이터가 많을수록 인덱스의 효과는 더욱 커지지만, 관리 비용이 증가할 수 있습니다.

2. 인덱스의 작동 방식

  1. 인덱스 생성
    • 인덱스를 생성하면 데이터베이스는 특정 컬럼의 값을 기반으로 정렬된 자료구조(B-Tree 또는 Hash Table)를 생성합니다.
    • 이를 통해 해당 컬럼을 검색할 때 전체 테이블을 스캔하지 않고 인덱스에서 빠르게 조회할 수 있습니다.
  2. 데이터 검색 과정
    • 사용자가 SELECT * FROM users WHERE name = 'Alice'; 같은 쿼리를 실행하면 데이터베이스는 먼저 인덱스를 확인합니다.
    • 인덱스에서 name = 'Alice'가 있는지 탐색한 후, 일치하는 행(Row)의 위치를 찾습니다.
    • 해당 행의 위치(레코드 포인터)를 기반으로 테이블에서 데이터를 가져옵니다.
  3. 데이터 삽입 및 업데이트
    • INSERT 또는 UPDATE가 실행되면 기존 인덱스도 업데이트됩니다.
    • 새로운 데이터가 삽입되면 인덱스도 함께 갱신되어야 하므로, 삽입 및 수정 성능이 저하될 수 있습니다.
  4. 데이터 삭제
    • DELETE 실행 시 해당 레코드가 제거되면서 인덱스도 갱신됩니다.
    • 사용되지 않는 인덱스 공간은 OPTIMIZE TABLE 명령어를 사용하여 최적화할 수 있습니다.

3. 인덱스의 종류

  1. Primary Index (기본 인덱스)
    • PRIMARY KEY 제약 조건이 적용된 열에 자동 생성됨.
    • 테이블당 하나만 존재할 수 있음.
  2. Unique Index (고유 인덱스)
    • 중복 값을 허용하지 않는 인덱스.
    • UNIQUE 제약 조건이 적용된 열에 생성됨.
  3. Composite Index (복합 인덱스)
    • 여러 개의 열(Column)로 이루어진 인덱스.
    • 특정 컬럼 조합을 기준으로 검색 성능 향상 가능.
  4. Full-Text Index (전문 검색 인덱스)
    • 대량의 텍스트 데이터를 검색할 때 사용됨.
    • LIKE '%검색어%' 보다 빠른 검색 성능 제공.
  5. Hash Index (해시 인덱스)
    • 해시 테이블 기반 인덱스로, = 연산에 최적화.
    • 범위 검색에는 적합하지 않음.

4. MySQL에서 인덱스 생성 및 활용 방법

MySQL에서는 CREATE INDEX 문을 사용하여 인덱스를 생성할 수 있습니다.

4.1 기본 인덱스 생성

CREATE INDEX idx_user_name ON users(name);

위 명령어는 users 테이블의 name 컬럼에 대해 인덱스를 생성합니다.

4.2 Unique Index 생성

CREATE UNIQUE INDEX idx_email ON users(email);

위 인덱스는 email 컬럼에 대해 고유한 값만 허용하는 인덱스를 생성합니다.

4.3 복합(Composite) 인덱스 생성

CREATE INDEX idx_user_composite ON users(name, age);

이 인덱스는 nameage 컬럼을 동시에 활용하여 검색할 때 성능을 최적화합니다.

4.4 Full-Text Index 생성

CREATE FULLTEXT INDEX idx_content ON articles(content);

이 인덱스는 articles 테이블의 content 컬럼에 대해 전체 텍스트 검색을 가능하게 합니다.

4.5 인덱스 삭제

DROP INDEX idx_user_name ON users;

특정 인덱스를 제거할 때 사용됩니다.

4.6 인덱스 조회

SHOW INDEX FROM users;

테이블의 모든 인덱스를 확인할 수 있습니다.


5. 인덱스의 장단점

✅ 장점

  • 검색 성능 향상: WHERE 절을 활용한 데이터 조회 속도 증가.
  • 정렬 속도 개선: ORDER BY, GROUP BY 연산이 더 빠르게 수행됨.
  • 쿼리 실행 시간 단축: 인덱스를 사용하면 불필요한 데이터 조회를 최소화할 수 있음.

❌ 단점

  • 저장 공간 증가: 인덱스가 추가되면 별도의 저장 공간이 필요.
  • 쓰기 성능 저하: INSERT, UPDATE, DELETE 시 인덱스도 함께 갱신해야 하므로 성능이 저하될 수 있음.
  • 잘못된 인덱스 사용 시 오히려 성능 저하: 너무 많은 인덱스는 오버헤드를 발생시킴.


 

6. 마무리

  • 데이터베이스 인덱싱은 검색 성능을 최적화하는 필수적인 기법이며, 적절한 인덱스 설계를 통해 효율적인 데이터 조회가 가능함.
  • MySQL에서는 다양한 종류의 인덱스를 제공하며, 테이블의 특성과 검색 패턴에 맞게 선택하여 활용하는 것이 중요함.
  • 인덱스는 장점이 많지만, 과도한 인덱스 사용은 성능 저하를 초래할 수 있으므로 신중한 설계가 필요함.