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는 분명 데이터베이스 최적화에 훌륭한 도구이지만 잘못 사용될 경우 오히려 더 느려지는 일이 생길 수 있기 때문에 신중하게 사용해야한다.