본문 바로가기
인천일보아카데미/- 학습일지

[학습일지]JAVA교육일지 61일차

by w1z 2022. 6. 30.

1. 인덱스(INDEX)


1. 인덱스(INDEX)

[ 정의 ]

- 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조

- 검색(SELECT)을 빠른 속도로 하기 위해서 사용하는 도구

- 특정 키워드(컬럼)만 모아놓은 별도의 테이블

- 인덱스 사용

    1) SELECT 작업이 테이블 대상으로 실행 X

    2) SELECT 작업이 인덱스 대상으로 실행 O

 

- Oracle에서는 테이블 생성 시 인덱스를 명시적으로 생성하지 않아도 자동으로 생성한다.

  (PK, UNIQUE 제약이 붙은 컬럼은 자동으로 인덱스가 생성된다.)

    1) PK를 WHERE절에 조건으로 SELECT            ----> 속도 빠름

    2) 일반컬럼을 WHERE절에 조건으로 SELECT ----> 속도 느림

SET TIMING ON; --경과시간을 보기위한 호출

-- 인덱스가 없는 상태에서 검색
SELECT DISTINCT NAME FROM tblIndex WHERE NAME = '홍길동'; -- 00:00:03.397

-- 인덱스 생성
CREATE INDEX IDX_TBLINDEX_NAME
    ON tblIndx(NAME);

-- 인덱스가 있는 상태에서 검색
SELECT DISTINCT NAME FROM tblIndex WHERE NAME = '홍길동'; -- 00:00:00.005
SELECT DISTINCT JOB FROM tblIndex WHERE JOB = '개발자'; -- 00:00:03.746


----> 확실히 INDEX를 생성한 다음 검색하는것이 빠르다는것을 알 수 있다.

 

[ 인덱스의 장점, 단점 ]

- 장점: 검색 처리 속도를 향상시킨다.

- 단점: 고비용

 

[ 인덱스 사용 ]

 1) 사용해야 하는 경우

   - 테이블 레코드가 많은 경우

   - 인덱스를 적용한 컬럼이 WHERE절에 많이 사용되는 경우

   - JOIN에 사용되는 컬럼(ON 부모.PK = 자식.FK)

   - 검색결과가 원본 테이블의 레코드의 2 ~ 4 %에 해당하는 경우

   - 해당 컬럼이 NULL을 포함하는 경우(색인 테이블안에 NULL이 제외)

 

 2) 사용하면 안되는 경우

   - 테이블의 레코드가 적은 경우

   - 검색 결과가 많은 경우

   - 원본 테이블(색인 컬럼) 에서 INSERT, UPDATE, DELETE 작업이 빈번하게 이루어질 경우

 

[ 인덱스 종류 ]

 1) 비고유 인덱스: 색인의 값이 중복이 가능하다.

CREATE INDEX IDX_tblInsa_buseo ON tblInsa(buseo);
--> buseo 컬럼에는 개발부, 영업부, 총무부, 인사부 등등.. 여러 부서가 중복으로 속해있다

 

 2) 고유 인덱스: 색인의 값이 중복이 불가능하다. (PK, Unique)

CREATE INDEX IDX_tblInsa_num ON tblInsa(num);
--> num 컬럼에는 각 고유번호(PK)가 있다.

 

 3) 단일 인덱스: 1개의 컬럼을 대상으로 인덱스 생성

CREATE INDEX IDX_tblInsa_name ON tblInsa(name);
--> name 1개의 컬럼을 대상으로 인덱스 생성

 

 4) 복합 인덱스, 결합 인덱스

CREATE INDEX IDX_tblInsa_buseo_name ON tblInsa(buseo, name);
--> buseo, name 두 개의 컬럼의 인덱스 생성

MEMO>

# 인덱스는 우리가 책에서 원하는 내용을 찾는다고 하면, 책의 모든 페이지를 찾아 보는것은 오랜 시간이 걸린다. 그렇기 때문에 책의 저자들은 책의 맨 앞 또는 맨 뒤에 색인을 추가하는데, 데이터베이스의 index는 책의 색인과 같다.

 

# 프로젝트와 병행 하면서 수업도 정리하다보니 내 머릿속에 아직 정리가 안되고, 개념이 잘 안잡힌것 같다.

   --> 정리안잡힌것: 프로시저, 커서, 트리거, 함수, 인덱스

 

# 주말 동안 프로젝트 마무리 작업하면서 개념 정리가 아직 덜 된 프로시저, 커서, 트리거, 함수, 인덱스를 공부 더 할 것!!