본문 바로가기

개발자 레니는 지금 -/데이터 베이스를 알아보는 중

Index 인덱스란






INDEX

: RDBMS에서 검색속도를 높이기 위해 사용하는 하나의 기술



- 해당 Table의 칼럼을 색인화(따로 파일로 저장)하여 검색 시 해당 table의 레코드를 full scan 하지 않고 색인화 되어있는 index 파일을 검색하여 검색속도를 빠르게 한다.

- Tree 구조로 색인화 하는데 Balance Search Tree를 사용한다.

- Oracle이나 MsSQL에서는 여러 종류의 tree를 선택하여 사용가능 하다.



원리

- Index를 해당 칼럼에 주게 되면 초기 table 생성 시 만들어진 MYD, MYI, FRM 3개의 파일중에서 MYI에 해당 칼럼을 색인화 하여 저장한다.

- Index를 사용하지 않을 경우 MYI파일은 비어 있다.

- 사용자가 select 쿼리로 index가 사용하는 쿼리를 사용시 해당 table을 검색하지 않고 tree로 정리해둔 MYI파일의 내용을 검색한다.

당연히, index를 사용하지 않은 select 쿼리는 해당 table full scan으로 검색한다.


목적

- 해당 RDBMS의 검색 속도를 높이는 것

- Select 쿼리의 where 나 join 예약어를 사용했을 때만 인덱스를 사용하여 select 쿼리의 검색 속도를 빠르게 하는데 목적을 두고 있습니다.

- Delete, insert, update 쿼리는 해당 사항이 없으며 오히려 index 사용시 좀 느려 진다.


장점

- 키 값을 기초로 하여 테이블에서 검색과 정렬 속도를 향상시킨다.

- 질의나 보고서에서 그룹화 작업의 속도를 향상시킨다.

- 인덱스를 사용하면 테이블 행의 고유성을 강화 시킬 수 있다.

- 테이블의 기본 키는 자동으로 인덱스 된다.

- 필드 중에는 데이터 형식 때문에 인덱스가 될 수 없는 필드도 존재한다.

- 여러 필드로 이루어진(다중 필드) 인덱스를 사용하면 첫 필드 값이 같은 레코드도 구분할 수 있다.

- 엑세스에서 다중 필드 엔덱스는 최대 10개의 필드를 포함할 수 있다.


단점

- 인덱스를 만들면 .mdb 파일의 크기가 늘어난다.

- 여러 사용자 응용 프로그램에서의 여러 사용자가 한 페이지를 동시에 수정할 수 있는 병행성이 줄어든다.

- 인덱스 된 필드에서 데이터를 업데이트하거나, 레코드를 추가 또는 삭제할 때 성능이 떨어진다.

- 인덱스가 데이터베이스 공간을 차지해 추가적인 공간이 필요해진다.

- 인덱스를 생성하는데 시간이 많이 소요될 수 있다.

- 데이터 변경 작업이 자주 일어날 경우 인덱스르 재작성해야 할 필요가 있기에 성능에 영향을 끼칠 수 있다.

따라서 어느 필드를 인덱스 해야 하는지 미리 시험해 보고 결정하는 것이 좋다. 인덱스를 추가하면 쿼리 속도가 1초 정도 빨라지지만, 데이터 행을 추가하는 속도는 2초 정도 느려 지게 되어 여러 사용자가 사용하는 경우 레코드 잠금 문제가 발생할 수 있다.


Index를 생성해야 하는 경우 vs 그렇지 않은 경우

- 인덱스는 열 단위로 생성된다.

- Where절에서 사용되는 칼럼을 인덱스로 만든다.

- 데이터의 중복도가 높은 열은 인덱스로 만들어도 효용이 없다. ( ex ) 성별, 타입이 별로 없는 경우, 적은 경우 등

- 외래키가 사용되는 열애는 인덱스를 되도록 생성해주는 것이 좋다.

- Join에 자주 사용되는 열에는 인덱스를 생성해주는 것이 좋다.

- Insert/update/delete가 얼마나 자주 일어나는 지를 고려한다.

- 사용하지 않는 인덱스는 제거하는 것이 좋다.