본문 바로가기
프로그래밍 공부 정리/database

Index(인덱스)

by 메기사랑 2021. 11. 28.

**인덱스 
==> 조건식에 자주 사용되는 칼럼에 대하여 
미리 색인표를 만들어 두는 것을 말합니다.
인덱스를 만들어두면 검색시에 빠른 성능을 기대할 수 있어요.

어떤 책이 한권 있다고 가정 합시다.
책이  10페이지도 안돼요
이런경우에는 굳이 색인표를 만들필요가 없어요.
책이 굉장히 두꺼워요 한 600페이지 1000페이지 정도 된다면
책의 내용을 빠르게 찾도록 책 맨뒤에 "색인표"를 만들어두면 
원하는 내용을 빨리 찾을 수 있어요.

마치 이것처럼
데이터양 많을 때 
검색(조건식)에 빈번히 사용하는 칼럼에 대하여 
"인덱스"를 만들어두면 
검색시에 성능효과를 기대할 수 있어요!

데이터양이 적으면
"인덱스"가 있으나 
없으나 성능효과를 체감하기는 어려워요

만약에 
책을만들어 놓고 
책 맨뒤에 "색인표"까지 만들어 두었는데
책 내용이 빈번히 바뀐다면
"색인표"는 의미가 없어지고 
오히려 찾기가 어려워져요!

마찬가지로
데이터의 수정,삭제가 빈번한 칼럼에 
"인덱스"를 만들어 두면
오히려 "성능저하"의 요인이 됩니다.

** 인덱스 만드는 방법

create index 인덱스이름 on 테이블이름 (컬럼이름,[컬럼이름])

ex) bookname을 대상으로 인덱스를 생성 (idx_book)
- 인덱스를 만들지 않고 책이름으로 검색
- 인덱스를 만든 후 책이름으로 검색


create index idx_book on book(bookname);



** 인덱스 삭제

drop index 인덱스명;

 

 

** 인덱스를 재 구성하는 방법

alter index 인덱스이름 rebuild;



ex) customer의 name으로 인덱스를 생성 해 봅니다.
create index idx_customer_name on customer(name);

select * from customer where name = '윤석열';

ex) 고객번호 6번의 이름을 '윤자바'로 수정
update customer set name  = '윤자바' where custid = 6;

==> 이와 같이 인덱스를 만들어 둔 데이터에 수정이 있다면
오히려 검색속도를 떨어트릴 수 있어요!

ex) idx_customer_name을 재구성 해 봅니다.
alter index idx_customer_name rebuild;

select * from customer where name = '윤자바';

** 인덱스가 효과를 발휘하려면
데이터 수정이 빈번하지 않아야 하고 
또, 인덱스를 설정한 칼럼의 같은 값의 종류가 많지 않아야 의미가 있어요.
100만건의 데이터중에 "주소"컬럼의 값의
"서울","울산","광주" 세가지 밖에 없다고 해봅시다.
이럴 경우에는 인덱스가 오히려 성능을 저하시키는 요인이 됩니다.

이때에는 인덱스를 삭제하는 것이 좋아요.

ex)  idx_customer_name 인덱스를 삭제 해 봅니다.
drop index  idx_customer_name;