Back-end/JAVA,Spring

[java]자바에서 인덱스란? Index

cheersHena 2018. 6. 22. 15:49
반응형

INDEX의 의미

RDBMS에서 검색속도를 높이기 사용하는 하나의 기술.
INDEX = 색인
해당 TABLE의 컬럼을 색인화(따로 파일로 저장)하여 검색시 해당 TABLE의 레코드를 full scan 하는게 아니라 색인화 되어있는 INDEX 파일을 검색하여 검색속도를 빠르게 함.
INDEX는 TREE구조로 색인화. RDBMS 에서 사용하는 INDEX는 Balance Search Tree 를 사용.


기본키는 인덱스를 가짐. 외래키는 안가짐

외래키를 따라가면 기본키가 나오는데 그 기본키가 인덱스를 가지는 것이다.

 INDEX의 원리  

INDEX를 해당 컬럼에 주게 되면 초기 TABLE생성시 만들어진 MYD(MySQL Data),MYI(MySQL Index),FRM(Format) 3개의 파일중에서 MYI에 해당 컬럼을 색인화 하여 저장.
물론 INDEX를 사용안할시에는 MYI파일은 비어 있음. 그래서 INDEX를 어떤 컬럼에 지정해 만들게 되면 해당 컬럼을 따로 인덱싱하여 MYI 파일에 입력. 
사용자가 SELECT 쿼리로 INDEX가 지정된 TABLE을 조회 할 시 TABLE 전체를 검색하는것이 아니라 빠른 TREE로 정리해 둔 MYI파일의 내용 부터 검색.
만약 INDEX를 지정하지 않은 테이블을 조회하는 SEELCT 쿼리라면 해당 TABLE을 full scan하여 모두 검색.

예) 책의 뒷부분에 있는 Index... 

INDEX의 장점

  - 키 값을 기초로 하여 테이블에서 검색과 정렬 속도를 향상.
  - 질의나 보고서에서 그룹화 작업의 속도를 향상.
  - 인덱스를 사용하면 테이블 행의 고유성을 강화시킬 수 있음.
  - 테이블의 기본 키는 자동으로 인덱스 됨.
  - 필드 중에는 데이터 형식 때문에 인덱스 될 수 없는 필드도 있다.
  

INDEX의 단점

  - 인덱스를 만들면 .mdb 파일 크기가 늘어난다.
  - 여러 사용자, 여러 응용 프로그램에서 한 페이지를 동시에 수정할 수 있는 병행성이 줄어든다.
  - 인덱스 된 필드에서 데이터를 업데이트하거나, 레코드를 추가 또는 삭제할 때 성능이 떨어진다.
  - 인덱스가 데이터베이스 공간을 차지해 추가적인 공간이 필요하다. (DB의 10퍼센트 내외의 공간이 추가로 필요)
  - 인덱스를 생성하는데 시간이 많이 소요될 수 있다.
  - 데이터 변경 작업이 자주 일어날 경우에 인덱스를 재작성해야 할 필요가 있기에 성능에 영향을 끼칠 수 있다.

이때문에 어느 필드를 인덱스로 지정 해야 하는지 미리 시험해 보고 결정하는 것이 좋다.
인덱스를 추가하면 쿼리 속도가 1초 정도 빨라지지만, 데이터 행을 추가하는 속도는 2초 정도 느려지게 되는데...
여러 사용자가 사용하는 경우 레코드 잠금 문제가 발생할 수 있음.
만드는 쿼리의 종류와 관계 없이 가장 고유한 값을 갖는 필드만 인덱스하는게 중요함.

INDEX의 목적

인덱스의 목적은 해당 RDBMS의 검색 속도를 높이는게 주 목적.
SELECT 쿼리의 WHERE절이나 JOIN 예약어를 사용했을때만 인덱스를 사용하게 되며 SELECT 쿼리의 검색 속도를 빠르게 하는게 목적.

※ DELETE,INSERT,UPDATE쿼리에는 해당 사항없고, 
INDEX 사용 중인 경우 느려짐.
  

인덱스를 지정 시 유의점.

  - 인덱스는 열 단위로 생성된다.
  - WHERE 절에서 사용되는 컬럼을 인덱스로 만든다.
  - 데이터의 중복도가 높은 열은 인덱스로 만들어도 효용이 없다. (예 : 성별, 타입이 별로 없는 경우, 적은경우)
  - 외래키가 사용되는 열에는 인덱스를 되도록 생성해주는 것이 좋다.
  - JOIN에 자주 사용되는 열에는 인덱스를 생성해주는 것이 좋다.
  - INSERT / UPDATE / DELETE가 얼마나 자주 일어나는지를 고려한다. 
자주일어나는 경우 사용하지 않는게 효율적..
  - 사용하지 않는 인덱스는 제거하자


반응형