DataBase
인덱스(INDEX)
Beencle
2023. 3. 22. 15:38
INDEX란
- DB에 테이블 검색 속도를 향상시키기 위한 자료구조
- 별도의 추가 저장 공간을 활용하여 인덱스 생성
- 데이터와 데이터 위치를 포함한 자료구조 생성
- 데이터를 빠르게 찾을 수 있기 때문에 디스크 엑세스 횟수 감소
- DBMS에서 인덱스를 자동으로 사용하며 유지 보수 수행
- 인덱스는 언제든지 생성 및 삭제가 가능하며 다른 테이블이나 인덱스에 영향을 주지 않음
- 인덱스를 통해 데이터 조회를 위한 SELECT뿐만 아니라 UPDATE와 DELETE의 성능도 향상
INDEX 관리
- 데이터에 변경이 발생하면 최신 상태 유지를 위해 인덱스 관리 필요
- 인덱스가 적용된 컬럼은 최신 데이터를 정렬된 상태로 유지
- INSERT, UPDATE, DELETE 발생 시 인덱스 관리 수행
- INSERT : 새로운 데이터에 대한 인덱스 추가
- UPDATE : 기존의 인덱스는 사용하지 않도록 처리하고, 갱신된 데이터에 대한 인덱스 추가
- DELETE : 삭제하는 데이터의 인덱스는 사용하지 않도록 처리
INDEX 장점
- 테이블 조회 속도 향상
- 전반적인 시스템 부하 감소
INDEX 단점
- 인덱스 관리를 위한 추가 작업 필요
- 데이터베이스의 약 10%정도의 추가 저장 공간 필요
- 잘못된 인덱스 사용으로 성능 저하 가능성
INDEX 사용에 적합한 경우
- 규모가 큰 테이블
- INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
- JOIN이나 WHRER 또는 ORDER BY 에 자주 사용되는 컬럼
- 중복되는 데이터가 최소인 컬럼
INDEX 자료구조
- 트리 형태의 자료구조를 주로 사용하며, 특히 B Tree계열에서 많이 사용
INDEX 조회
SELECT * FROM user_indexes;
SELECT * FROM user_indexes WHERE table_name = '테이블 이름';
INDEX 컬럼 조회
SELECT * FROM user_ind_columns;
SELECT * FROM user_ind_columns WHERE table_name = '테이블이름';
INDEX 사용 여부
SELECT * FROM 테이블이름 WHERE 조건;
INDEX 예제
[ CRATE TABLE ]
CREATE TABLE customers(
customer_id number NOT NULL PRIMARY KEY,
first_name varchar2(10) NOT NULL,
last_name varchar2(10) NOT NULL,
email varchar2(10),
phone_number varchar2(20),
regist_date
);
[ INSERT ]
INSERT INTO customers VALUES(1,'Suan','Lee','suan',010-1234-1234,'21/01/01');
INSERT INTO customers VALUES(2,'Elon','Musk','elon',010-1111-2222,'21/05/01');
INSERT INTO customers VALUES(3,'Steve','Jobs','steve',010-3333-4444,'21/010/01');
INSERT INTO customers VALUES(4,'Bill','Gates','bill',010-5555-6666,'21/11/01');
INSERT INTO customers VALUES(5,'Mark','Zuckerberg','mark',010-7777-8888,'21/02/01');
[ customers 테이블 INDEX 조회 ]
SELECT * FROM user_indexes WHERE table_name = 'CUSTOMERS';
방금 만든 테이블에 우린 인덱스를 만들지 않았지만 조회를 해보면 하나의 인덱스가 생성된 게 보인다.
그 인덱스는 우리가 만들었던 PRIMARY KEY이다.
[ INDEX 생성 ]
CREATE INDEX regist_date_idx ON customers(regist_date);
[ 다중 속성 INDEX 생성 ]
CREATE INDEX name_idx ON customers(first_name, last_name);
이렇게 인덱스를 만들고 쿼리를 이용해 SELECT하게 되면 해당 조건에 컬럼 인덱스가 활용되어 검색하게 된다.
[ 고유 INDEX 생성 ]
CREATE UNIQUE INDEX email_idx ON customers(email);
[ INDEX 삭제 ]
DROP INDEX 인덱스이름;
이처럼 각각의 인덱스를 삭제할 수 도 있지만 테이블이 삭제되면 해당 테이블에 존재하는 인덱스들이 모두 삭제된다.
이렇게 INDEX 에 대해 공불르 해봤는 INDEX의 사용법은 어렵지 않다. 오히려 쉬운 편이지만 이런 INDEX의 기능을 언제 어떻게 사용하는지가 매우 중요하다. INDEX는 분명 데이터베이스 최적화에 훌륭한 도구이지만 잘못 사용될 경우 오히려 더 느려지는 일이 생길 수 있기 때문에 신중하게 사용해야한다.