DB

[Database]Global Index VS Local Index

파주상남자의 오답노트 ㅣ 2025. 3. 5. 13:37

반응형

1. Global Index

특징

  • 테이블 전체에 걸쳐 하나의 인덱스만 존재
  • 파티션과 관계없이 데이터를 정렬하고 관리
  • 범용적인 검색 속도는 빠르지만, DML(INSERT, UPDATE, DELETE) 작업 시 성능 저하 가능성 있음

장점

범위 검색(테이블 전체 조회)이 빠름

  • 여러 파티션을 넘나드는 검색(예: 특정 사용자 ID 조회)이 필요할 때 성능이 좋음✔ WHERE 조건에 특정 컬럼만 사용해도 효율적
  • WHERE user_id = ? 같은 조건에서 특정 파티션을 찾을 필요 없이 바로 검색 가능

단점

DML 작업 시 인덱스 재구성 필요

  • 특정 파티션만 변경해도 전체 인덱스가 영향을 받음❌ 파티션 드롭(삭제) 시 인덱스 재구성 필요
  • 특정 파티션을 삭제하면 전체 Global Index를 다시 만들어야 함삽입/삭제가 많을 경우 성능 저하 가능

예제 (Global Index 생성)

sql
CREATE INDEX idx_global_request ON A_requests (user_id) GLOBAL;
  • user_id를 기준으로 테이블 전체에서 정렬된 인덱스가 생성됨.
  • 특정 사용자 ID를 검색할 때 빠름.

2. Local Index

특징

  • 각 파티션별로 개별적인 인덱스가 생성됨.
  • 해당 파티션에서만 검색되며, 다른 파티션의 데이터는 인덱스가 모름.
  • 파티션을 드롭(삭제)해도 해당 파티션의 인덱스만 삭제되므로 관리 용이함.

장점

DML 성능이 좋음 (INSERT, UPDATE, DELETE 부담이 적음)

파티션 삭제 시 전체 인덱스에 영향 없음

파티션 범위가 명확할 경우 검색 성능이 향상됨

단점

다중 파티션을 검색할 때 성능이 떨어짐

  • WHERE user_id = ? 같은 조건이 모든 파티션을 탐색해야 할 수도 있음파티션 키를 포함하지 않은 WHERE 조건에서는 비효율적
  • 예: WHERE user_id = ?는 잘 작동하지 않을 수 있음
  • 하지만 WHERE created_at BETWEEN '2024-01-01' AND '2024-01-31' 처럼 파티션 키 기반 검색은 빠름

예제 (Local Index 생성)

sql
CREATE INDEX idx_local_request ON A_requests (user_id) LOCAL;
  • 각 파티션별로 user_id 인덱스가 생성됨.
  • 해당 파티션에서만 빠르게 검색됨.

3. Global Index vs Local Index 비교 정리

비교 항목 Global Index Local Index

인덱스 구조 하나의 전체 인덱스 파티션별 개별 인덱스
검색 속도 전체 테이블 검색 시 빠름 특정 파티션 검색 시 빠름
DML 성능 느림 (전체 인덱스 재구성 필요) 빠름 (해당 파티션만 영향)
파티션 삭제 시 영향 전체 인덱스 재구성 필요 해당 파티션의 인덱스만 삭제됨
적용 예시 user_id로 전체 검색 날짜 기반 파티션 검색
추천 사용 사례 전체 테이블에 걸친 검색이 많을 때 특정 파티션에서만 검색할 때

4. 어떤 인덱스를 사용해야 할까?

📌 Global Index가 적합한 경우

  • 사용자 ID, 계정 ID 같은 범용적인 검색이 많을 때
  • 예: SELECT * FROM A_requests WHERE user_id = ?
  • ✅ 장점: 범위 검색이 빠름
  • ❌ 단점: DML 작업이 많으면 성능 저하 가능

📌 Local Index가 적합한 경우

  • 데이터가 날짜/기간별로 파티션되어 있고, 특정 파티션만 검색할 때
  • 예: SELECT * FROM A_requests WHERE created_at BETWEEN '2024-01-01' AND '2024-01-31'
  • ✅ 장점: DML 작업이 많아도 성능 유지
  • ❌ 단점: 다중 파티션 검색 시 속도가 느려질 수 있음

5. 결론

"승인 요청자가 버튼을 눌렀을 때 A → B로 넘어가는 시간이 느린 경우",

"INSERT 작업만 발생하고 테이블이 파티션되어 있는 경우"

"승인 요청이 특정 날짜 범위(예: created_at)에 따라 많이 검색된다면?"

Local Index를 사용하는 것이 적합

"승인 요청이 사용자 ID, 계정 ID 기준으로 전체 테이블 검색이 많다면?"

Global Index를 사용하는 것이 적합

👉 현재 상황에 맞게 Global/Local Index를 적절히 선택하면 성능이 개선될 가능성이 높습니다! 🚀

반응형