Index란?

2024. 11. 15. 07:32·Database
반응형

데이터베이스에서 방대한 양의 데이터 가운데 원하는 데이터를 더 빠르게 찾을 수 있는 방법 중 하나는 Index입니다.

 

오늘은 Index에 대해서 다뤄보려고 합니다.


Index란?

Index는 데이터베이스에서 특정 데이터를 더 빠르게 찾을 수 있도록 도와주는 아이입니다.

가령, 색인을 예로 들 수 있는데요. 책에서 특정 주제를 찾을 때, 색인을 사용하면 해당 주제를 더 빨리 찾을 수 있듯이, Index를 사용하면 데이터베이스 내의 원하는 데이터를 더 빠르게 찾을 수 있습니다.

 

Index 기본 구조

Index 기본 구조에는 B-Tree와 Hash Index가 있습니다.

1. B-Tree

- 가장 일반적으로 사용되는 구조입니다. 검색, 삽입, 삭제 시 성능이 균형적으로 유지되도록 설계된 트리 구조입니다.

 

2. Hash Index

- 정확한 값을 빠르게 찾을 때 사용됩니다. 하지만 범위로 검색할 때는 적합하지 않습니다.

 

Index의 원리

Index는 데이터베이스 테이블에서 특정 열에 대해 추가적인 데이터를 저장합니다.

이 Index 테이블은 테이블의 원본 데이터와는 별개로 유지되며, 필요한 데이터에 더 빠르게 접근할 수 있도록 합니다.

쿼리를 실행하게 된다면, 일단 Index를 확인하여 해당하는 데이터의 위치를 파악한 후, 실제 데이터를 검색합니다.


Index를 굳이 사용해야 하는 이유

물론 작은 규모일 때는 테이블 전체를 순차적으로 읽는 방식도 성능에 큰 영향을 미치지 않습니다. 그러나 데이터의 양이 많아지면 테이블 스캔 속도는 느려지게 됩니다. 이때, 특정 열에 Index를 생성한다면? 성능을 크게 향상시킬 수 있습니다.

 

Index가 사용되는 상황

1. 자주 검색하는 칼럼

- where절에 자주 사용되는 열에 Index를 추가하면 검색 속도가 향상됩니다.

 

2. Join에서 사용되는 칼럼

-  두 테이블을 조인할 때 자주 사용되는 열에 Index를 걸어두면 join 속도가 개선됩니다.

 

3. 정렬이나 그룹화가 필요한 칼럼

-  order by나 group by에 자주 사용되는 열에도 Index를 생성하면 정렬과 그룹화 속도를 향상시킬 수 있습니다.


Index 생성해 보기

1. 단일 열 Index

CREATE INDEX idx_region ON announcement (region);

 

announcement 테이블의 region 열에 대해 Index를 생성하는 명령어입니다.

그럼 추후 region으로 검색할 때 성능이 기존에 비해 개선된 모습을 볼 수 있습니다.

 

2. 복합 Index

여러 열에 대해 복합 Index를 생성하면 더 복잡한 검색 성능을 개선할 수 있습니다.

CREATE INDEX idx_region_career ON announcement (region, career_base);

 

announcement 테이블의 region과 career_base 두 열을 기반으로 Index를 생성하는 명령어입니다.

 


Index 삭제

Index가 많으면 많을수록 성능이 무조건 향상되는 건 아닙니다.

불필요한 Index는 오히려 성능을 저하시킬 수 있으므로, 사용되지 않는 Index는 아래 명령어를 통해 삭제할 수 있습니다.

DROP INDEX idx_region ON announcement;

Index가 성능에 미치는 영향

1. 읽기 성능 개선

Index가 있으면 데이터베이스는 테이블의 전체 데이터를 스캔할 필요 없이, Index를 통해 빠르게 데이터를 찾을 수 있습니다.

 

가령, 백만 개의 채용 정보를 담고있는 데이터베이스에서 특정 조건을 가진 공고를 찾기 위해 백만개의 행을 모두 읽어야 하는 상황이 있습니다.

 

만약 이 상황에서 Index를 활용한다면, 백만 개가 아닌 훨씬 더 적은 비용으로 데이터를 찾을 수 있습니다.

 

2. 쓰기 성능 저하

Index는 그럼 장점만 있나? 에 대해서 궁금해하실 수 있습니다.

Index를 추가하면 쓰기 성능은 저하가 될 수 있습니다. 새로운 데이터를 삽입하거나 기존 데이터를 수정할 때마다, 데이터베이스는 Index를 갱신해야 하기 때문입니다.

 

따라서 쓰기 작업이 많다면 Index를 신중하게 선택하는 것이 중요합니다.


Index 성능 테스트

마지막으로 Index를 생성한 후 성능 테스트 방법에 대해서 소개해드리겠습니다.

성능 차이를 확인하기 위해서는 EXPLAIN 명령어를 사용할 수 있습니다.

EXPLAIN은 데이터베이스가 쿼리를 실행할 때 어떻게 처리하는지 보여줍니다.

 

1. Index 없이 실행 계획 확인하기

EXPLAIN SELECT * FROM announcement WHERE region = '서울';

 

2. Index 생성 후 실행 계획 확인하기

CREATE INDEX idx_region ON announcement (region);
EXPLAIN SELECT * FROM announcement WHERE region = '서울';

 


결론

Index는 대규모 데이터베이스에서 매우 중요한 성능 개선 도구입니다.

 

하지만 무조건 많은 Index를 추가하는 것이 아닌, 데이터 분석을 통해 데이터를 어떻게 활용하고 사용할 것인지 파악해야 합니다.

 

자주 사용하는 검색 열에 적절한 Index를 설정하면, 데이터 조회 성능을 극대화할 수 있지만, Index가 많아질수록 쓰기 성능은 저하될 수 있다는 점은 항상 유의해야 합니다.

 

 

반응형

'Database' 카테고리의 다른 글

Window11 Oracle Database 설치  (2) 2024.12.14
Error Code: 2013. Lost connection to MySQL server during query  (0) 2024.12.01
mysql 외부접속 connection locked (Unblock with 'mysqladmin flush-hosts')  (2) 2024.10.02
Keepalived를 활용하여 Active(Master)-Standby(Slave)  (2) 2024.06.23
데이터베이스 이중화(Database Replication) - Master/Slave  (0) 2024.05.17
'Database' 카테고리의 다른 글
  • Window11 Oracle Database 설치
  • Error Code: 2013. Lost connection to MySQL server during query
  • mysql 외부접속 connection locked (Unblock with 'mysqladmin flush-hosts')
  • Keepalived를 활용하여 Active(Master)-Standby(Slave)
Hyunily
Hyunily
    반응형
  • Hyunily
    Hyunily
    Hyunily
  • 전체
    오늘
    어제
    • 분류 전체보기 (45)
      • Daily (16)
      • 한화시스템 Beyond (6)
      • CS (3)
      • Database (10)
      • Monitoring (2)
      • Spring (8)
  • 블로그 메뉴

    • 홈
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
Hyunily
Index란?
상단으로

티스토리툴바