min's devlog

인덱스(index) 본문

til/Oracle

인덱스(index)

값진 2022. 5. 11. 14:27

인덱스(index)

  - 테이블에서 원하는 데이터를 쉽고 빠르게 찾기 위해 사용 > 검색이 자주 사용되는 테이블에서 사용

  - SQL 명령 처리 속도를 빠르게 하기 위해서 특정 컬럼에 대해 생성되는 검색 도구

  - b-tree 구조

 

 

인덱스의 사용

초기 데이터베이스는 정렬 개념이 적용되어있지 않기 때문에, 테이블내의 레코드 순서는 사용자가 필요로 하는 정렬 상태가 아니다. 어떤 데이터를 검색할 때 처음부터 끝까지 차례대로 찾아야하는 상황이면 테이블 전체를 스캔하고, 인덱스를 사용에 용이한 상황은 특정 컬럼을 선택해 별도의 테이블에 복사한 후 미리 정렬시켜놓을 때이다.

(원본 테이블 <- 참조 -> 인덱스)

 

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

  - 단점 :  인덱스 사용을 많이 하면 전체적인 DB의 성능을 저하시킨다.

 

 

인덱스를 사용해야하는 경우

  - 테이블에 데이터(행)가 너무 많을 때
  - where절에 사용되는 횟수가 많은 컬럼에 적용
  - join에 조건으로 사용되는 컬럼에 적용 PK-FK
  - 인덱스의 손익분기점 > 검색 결과가 10~15% 이하인 경우
  - null을 포함하는 경우 > null 인덱스에서 제외

 

* 그 반대의 경우

  - 테이블에 데이터(행)가 적은 경우엔 의미가 없다.
  - 인덱스의 손익분기점 > 검색 결과가 15% 이상인 경우
  - 해당 테이블의 삽입, 수정, 삭제가 빈번할 경우

 

 

인덱스 사용

--생성
CREATE INDEX TBLINSA
ON RESERVATION(NAME);

--추가
ALTER TABLE TBLRESERVATION
ADD INDEX NameIdx (Name);

--삭제
ALTER TABLE 테이블이름
DROP INDEX 인덱스이름

DROP INDEX 인덱스이름
ON 테이블이름

  - CREATE INDEX 인덱스 이름 ON 테이블 이름(필드명1, 필드명2..)

 

 

인덱스의 종류

 

  • 고유 인덱스
create unique index idxName on tblIndex(name); --동명이인(X)

      색인의 값이 중복이 불가능하다. (PK, UNIQUE)

 

  • 비고유 인덱스
create index idxBuseo on tblIndex(buseo);

      색인의 값이 중복이 가능하다. (일반 칼럼)

 

  • 단일 인덱스
create index idxBuseo on tblIndex(buseo);
select count(*) from tblIndex where buseo = '기획부'; -- 인덱스 효과O
select count(*) from tblIndex where buseo = '기획부' and name = '홍길동'; -- 인덱스 효과X

      컬럼 1개를 대상으로 한다.

 

  • 복합 인덱스
create index idxBuseoName on tblIndex(buseo, name);
select count(*) from tblIndex where buseo = '기획부' and name = '홍길동'; -- 인덱스 효과O
select count(*) from tblIndex where name = '홍길동' and buseo = '기획부';

      컬럼 N개를 대상으로 한다.

 

  • 함수 기반 인덱스
create index idxSsn on tblIndex(ssn);
create index idxSsn2 on tblIndex(substr(ssn, 8, 1));
select count(*) from tblIndex where substr(ssn, 8, 1) = '1'; --5초

 

'til > Oracle' 카테고리의 다른 글

ANSI SQL  (0) 2022.05.18
[Education center] 데이터 생성  (0) 2022.05.17
PL/SQL  (0) 2022.05.09
DDL과 DML  (0) 2022.05.04
뷰(view)  (0) 2022.05.03
Comments