Index

tacoyaggi ㅣ 2024. 2. 20. 08:58

정의

인덱스는 데이터베이스 테이블 내의 특정 열 또는 열의 조합에 대한 검색 및 쿼리 성능을 향상시키기 위해 사용 합니다. 인덱스는 데이터베이스 엔진에게 데이터를 더 효율적으로 검색하고 정렬하는 방법을 제공하여 쿼리의 실행 속도를 상승 시키는데 도움이 됩니다. 인덱스는 특정 열에 대한 빠른 데이터 검색을 가능하게 하고 이를 통해 데이터베이스 엔진은 전체 테이블을 스캔하는 대신 인덱스를 사용하여 빠르게 해당 행을 찾을 수 있습니다. 이는 곧 데이터베이스 성능 향상을 의미 합니다. 인덱스를 생성할 때는 테이블에 존재하는 중요한 열이나 자주 검색되는 열을 대상으로 적용 해야 합니다. 일반적으로 검색 조건이 자주 사용되는 열에 인덱스를 생성하는 것이 좋습니다. 인덱스를 지나치게 많이 생성하면 INSERT, UPDATE, DELETE의 성능에 영향을 줄 수 있으므로 많은 부분을 고려해야 합니다. 

 

 

예제

인덱스를 적용해 보도록 하겠습니다. Member라는 테이블에 MemberSeq 필드에 인덱스를 적용해 보겠습니다. 

테이블 구조는 아래와 같습니다. 

 

아래 코드로 인덱스를 생성하도록 하겠습니다. 인덱스는 한번 생성하면 변경할 수 없습니다. 생성한 후에는 해당 인덱스를 삭제하고 새롭게 구성해야 합니다. 

create index idx_MemberSeq on Member(MemberSeq);

 

인덱스가 잘 생성 되었습니다. 

 

데이터는 약 3천개 정도로 테스트하였고 인덱스가 존재할 경우 존재하지 않을 경우 2가지로 테스트 해봤습니다. 

아래는 인덱스가 존재할 경우의 속도 입니다.

 

인덱스 삭제 방법에 대해서도 알아보겠습니다. 아래 코드를 통해서 특정 인덱스를 삭제할 수 있습니다. 

drop index idx_MemberSeq on Member

 

아래는 인덱스를 제거하고 진행한 테스트 결과 입니다. 데이터가 많지 않고 단순한 Select 쿼리 테스트이지만 확실히 비용에서 차이가 있습니다. 

 

이번에는 모든 필드에 인덱스를 적용하고 모든 필드를 조회는 테스트를 해보겠습니다. 전체 필드에 인덱스를 사용하면 테이블의 모든 열에 대해 빠른 검색 및 조회를 수행할 수 있지만, 일반적으로 모든 상황에 적합하지는 않습니다. 전체 테이블 인덱스를 생성하면 인덱스의 크기가 매우 커질 수 있고 인덱스의 업데이트 비용도 높아질 수 있습니다. 또한 인덱스가 필요하지 않은 열까지 인덱스를 적용하면 불필요한 오버헤드가 발생할 수 있습니다. 

create index idx_ALLColumns on Member (MemberSeq
,Name
,Gender
,BirthDay
,Morph
,Memo
,MotherSeq
,FatherSeq
,CreateTime)

 

아래 결과는 인덱스 없이 모든 필드를 조회한 결과 입니다. 

 

아래는 모든 필드의 인덱스를 적용하고 전체 조회를 적용한 결과 입니다. 비교해보면 차이가 없습니다. 

 

 

결론

인덱스는 책갈피 같은 역할로 좀 더 적은 비용으로 빠르게 데이터를 조회 할 수 있게 해줍니다. 예제에서는 단순히 조회 쿼리만 적용해서 테스트를 해봤지만 추후에는 조인 및 무거운 다량의 데이터 환경에서 테스트를 진행해 보면 인덱스의 차이를 느낄 수 있을 것 같습니다.