Programing Language/SQL

데이터베이스 인덱스 활용

Data-SSung 2025. 6. 15. 17:19
반응형

인덱스 활용은 데이터베이스가 쿼리를 실행할 때 인덱스를 사용해서 데이터를 빠르게 찾는 것을 말해요.

인덱스란?

인덱스는 책의 목차나 색인처럼 데이터의 위치를 미리 정리해둔 구조예요. 테이블의 특정 컬럼 값들을 정렬해서 저장하고, 각 값이 실제 테이블의 어느 행에 있는지 포인터를 가지고 있어요.

 

왜 >, < 연산자가 함수보다 좋을까?

컬럼을 함수 활용하면 모든 DB를 다 탐색하는데, 인덱스로 연산자 활용하면 필요한 부분만 확인해서 더 성능을 효율적으로 사용가능

 

추가로 기억할 점:

  • 함수 사용 = 전체 스캔 (느림)
  • 연산자 사용 = 필요한 부분만 (빠름)

 

인덱스를 탈 수 있는 경우:

 
sql
-- 인덱스 활용 가능 (Index Seek)
WHERE age > 25
WHERE salary < 50000
WHERE created_date >= '2024-01-01'

인덱스를 못 타는 경우:

 
sql
-- 인덱스 활용 불가 (Full Table Scan)
WHERE YEAR(created_date) = 2024
WHERE UPPER(name) = 'JOHN'
WHERE age + 10 > 35

 

성능 차이

  • 인덱스 활용 시: O(log n) 시간복잡도로 빠른 검색
  • 풀 테이블 스캔 시: O(n) 시간복잡도로 모든 행을 확인

예를 들어 100만 건 데이터에서:

  • 인덱스 사용: 약 20번의 비교로 찾기
  • 풀 스캔: 최대 100만 번의 비교 필요

그래서 WHERE절에서는 컬럼을 가공하지 않고 원본 그대로 비교 연산자를 사용하는 게 성능상 유리해요.


시간복잡도란?

데이터 양이 늘어날 때 처리 시간이 얼마나 증가하는지를 나타내는 지표예요.

구체적인 비교

인덱스 사용 시 (O(log n)):

  • 100건 → 약 7번 비교
  • 1,000건 → 약 10번 비교
  • 100만건 → 약 20번 비교
  • 1억건 → 약 27번 비교

풀 테이블 스캔 시 (O(n)):

  • 100건 → 최대 100번 비교
  • 1,000건 → 최대 1,000번 비교
  • 100만건 → 최대 100만번 비교
  • 1억건 → 최대 1억번 비교

왜 이런 차이가 날까?

인덱스는 이진 탐색(Binary Search) 방식으로 동작해요:

 
정렬된 인덱스: [1, 5, 10, 15, 20, 25, 30, 35, 40]
WHERE age > 25 를 찾을 때:

1단계: 중간값 20 확인 → 25보다 작음 → 오른쪽으로
2단계: 중간값 35 확인 → 25보다 큼 → 왼쪽으로  
3단계: 25 발견!

반면 함수를 쓰면 모든 행을 하나씩 확인해야 해요:

 
sql
WHERE YEAR(created_date) = 2024
-- 각 행마다 YEAR() 함수 실행 후 비교

그래서 데이터가 많을수록 인덱스 활용의 성능 차이가 기하급수적으로 커져요.

반응형