본문 바로가기
  • 개발 삽질 블로그
데이터/데이터베이스

[Database] Index(인덱스)와 최적화

by 갹둥 2024. 8. 2.

✨Index?

인덱스는 데이터베이스 테이블의 특정 컬럼에 대해 빠른 검색을 가능하게 하는 데이터 구조입니다. 책의 색인처럼, 인덱스는 데이터의 위치를 신속하게 찾아낼 수 있도록 돕습니다. 데이터베이스에서 인덱스를 사용하면 검색, 정렬, 필터링 작업을 더욱 효율적으로 처리할 수 있습니다.
  • 숫자, 날짜, 텍스트 데이터에서의 정확한 일치 검색에 사용
  • 데이터를 빠르게 조회하고 정렬하는 데 사용
  • 테이블 간의 조인 작업을 빠르게 수행할 수 있음

 

 

인덱스의 기본 구조

  • 인덱스는 데이터베이스에서 다양한 형태로 구현될 수 있으며, 가장 일반적인 구조는 B-트리(Balanced Tree)입니다.(여기서 자세한 자료 구조 설명은 생략하겠습니다..ㅎㅎ)

1. B-트리 인덱스

  • 특징: 균형 잡힌 트리 구조로, 모든 노드가 정렬된 상태를 유지
  • 장점: 검색, 삽입, 삭제 작업의 시간 복잡도가 O(log N)

2. 해시 인덱스

  • 특징: 해시 함수를 사용하여 키와 데이터의 위치를 매핑
  • 장점: 고정된 크기의 해시 테이블을 사용하여 빠른 조회 성능을 제공

3. 비트맵 인덱스

  • 특징: 각 값을 비트로 표현하여 효율적인 압축과 검색을 제공
  • 장점: 대량의 데이터를 빠르게 검색할 수 있지만, 업데이트가 자주 발생하는 경우 성능이 저하될 수 있음

 

 

 

📌인덱스 종류

1. 단일 컬럼 인덱스

  • 설명: 단일 컬럼에 대해 생성되는 인덱스
  • 사용 예: 특정 컬럼의 검색 성능을 향상시키는 데 사용

2. 복합 인덱스

  • 설명: 두 개 이상의 컬럼에 대해 생성되는 인덱스
  • 사용 예: 여러 컬럼을 기준으로 검색하거나 정렬할 때 유용 

3. 유니크(Unique) 인덱스

  • 설명: 인덱스가 생성된 컬럼에 대해 중복된 값이 없음을 보장
  • 사용 예: 사용자 ID나 이메일 주소와 같이 유일해야 하는 값을 다룰 때 사용

4. 풀 텍스트(Full-Text) 인덱스

  • 설명: 텍스트 데이터에 대해 효율적인 검색을 지원합니다.
  • 사용 예: 문서, 블로그 게시물 등의 텍스트를 검색할 때 사용됩니다.

 

 

🔮MySQL에서 인덱스 사용법

//테이블 생성하면서 인덱스 생성
CREATE TABLE member(
	id INT AUTO_INCREMENT PRIMARY KEY,
	last_name VARCHAR(20),
	first_name VARCHAR(40),
	INDEX idx_last_name (last_name)
);

//이미 존재하는 테이블의 특정 컬럼에 인덱스 생성
CREATE INDEX idx_first_name ON member(first_name);

//인덱스 확인
SHOW INDEX FROM member; 

//인덱스 삭제
DROP INDEX idx_first_name ON table_name;

 

  • 다양한 데이터 타입으로 index 생성 가능
  • 자주 사용되는 컬럼에 index를 생성하면 조회 성능이 향상됨
  • 특정 컬럼의 값을 기준으로 데이터의 위치를 빠르게 찾아줌(B-Tree 기반으로 동작)
  • 특정 컬럼에 index를 생성해서 해당 컬럼의 값을 정렬하여 빠르게 검색이 가능함
  • 인덱스 사용 시 고려해야할 점
    • 데이터가 변경되면 인덱스도 업데이트 해야하므로 추가 비용이 발생함.
    • 즉, 조회는 빨라지는데 삽입, 삭제, 수정에는 추가적인 비용이 듬
    • 인덱스를 수정할 때 DB에 Lock이 걸리고...

 

 

🪄index 최적화

  • 복합 index 사용
    • 여러 컬럼을 동시에 검색할 때는 복합 index를 사용하는 것이 좋을 수도 있음
    • ex) name, department를 함께 자주 검색한다면 하나의 인덱스에서 2개의 컬럼을 사용
  • 함수나 연산자를 사용하지 않도록 쿼리 작성
    • ex) 아래처럼 연산자를 사용하면 인덱스 사용의 장점을 적절히 사용할 수 없음
    SELECT * FROM member WHERE UPPER(last_name) = 'KIM';
    
  • 상황에 따라 적절한 index 관리가 필요함
    • explain 명령어를 통해 index 성능을 분석해보기
    • 불필요한 index 제거 고려
    • 필요한 index 추가 고려