이미지09
Coding Story/DATABASE

[ Database ] 인덱스 Index

반응형

 

 

인덱스란?

그냥 단순히 생각하면 검색을 빠르게 하기 위한 자료구조이다.

 

보통 기본키가 자동으로 인덱스 설정되는데 데이터가 반드시 정렬이 되있어야 한다.

 

 

인덱스의 장점

검색할 때 인덱스를 기준으로 바로 찾아나가기 때문에 검색 속도가 빨라진다.

 

시스템에 걸리는 부하를 줄여 시스템 전체 성능을 향상시킨다.

 

 

인덱스의 단점

인덱스를 생성하는데 시간과 공간이 소요된다.

 

데이터 변경작업(INSERT, UPDATE, DELETE)이 자주 일어날 경우에는 오히려 성능이 저하된다.

 

 

 

 

그럼 인덱스 명령어들은 무엇이 있을까?

 

 

단일 인덱스 생성

CREATE INDEX 인덱스명 ON 테이블명 (컬럼명)

 

 

복합 인덱스 생성

CREATE INDEX 인덱스명 ON 테이블명 (컬럼명1, 컬럼명2...)

 

 

중복 불가능한 인덱스 생성

CREATE UNIQUE INDEX 인덱스명 ON 테이블명 (컬럼명)

 

 

인덱스 삭제

ALTER TABLE 테이블명 DROP INDEX 인덱스명

 

 

인덱스 재구성

ALTER INDEX 인덱스명 REBUILD

 

 

 

 

그럼 인덱스는 항상 사용해야하는 것인가?

정답은 'NO' 다. 계획성 없이 너무 많은 인덱스를 지정하면 오히려 성능을 저하시킨다.

 

 

 

 

그렇다면 언제 인덱스를 사용해야 할까?

테이블에 행의 수가 많을 때, WHERE 조건절에 해당 컬럼이 많이 사용될 때,

검색 결과가 전체 데이터의 10% 미만 정도일 때, JOIN 에 자주 사용되는 컬럼이나 NULL 을 포함하는 컬럼이 많을 때.

 

 

 

 

반대로 언제 인덱스를 사용하면 안될까?

테이블에 행의 수가 적을 때, WHERE 조건절에 해당 컬럼이 자주 사용되지 않을 때,

검색 결과가 전체 데이터의 10% 를 넘어갈 때, 테이블에 DML 작업이 많은 경우.

즉, 입력 수정 삭제 등이 자주 일어날 때.

 

 

 

 

그럼 인덱스를 사용했고, 이 인덱스를 계속 놔둬도 되는가?

그건 또 아니다. 인덱스를 이전에 생성했더라도 가끔 한번씩 재생성 해주어야 더 좋은 효율을 낼 수 있다.

 

 

 

 

끝으로, 인덱스를 사용하다보면 인덱스를 삭제해야할 경우가 오기 마련인데

 

이 때 해당 인덱스가 현재 사용되어지고 있는지 아닌지 구분하지 못하고 막무가내로 삭제했다가

 

나중에 생각지도 못한 부분에서 문제가 발생할 수 있다.

 

이를 방지하기 위해 Oracle 11g 버전부터 Invisible Index ( 인비저블 인덱스 ) 라는 기능을 새롭게 제공하고 있다.

 

이는 인덱스를 실제 삭제하기 전 '사용 안함' 상태로 만들어 테스트를 해볼 수 있도록 해주는 기능이다.

 

Invisible Index 를 보통 어떻게 사용하는지 궁금하면 이 블로그를 참조하길 바란다.

 

 

 

 

 

반응형