인덱스

최주영·2024년 2월 15일
0

오라클

목록 보기
22/22
post-thumbnail

✅ 인덱스

  • 데이터베이스에서 (데이터 양이 방대한 이유로) 테이블 검색 속도를 향상시키기 위한 자료구조
  • 별도의 추가 저장 공간을 활용하여 인덱스 생성
  • 데이터를 빠르게 찾을 수 있기 때문에 디스크 엑세스 횟수 감소
  • DBMS에서 인덱스를 잗종으로 사용하며 유지보수 수행
  • 인덱스는 언제든지 생성 및 삭제가 가능하며 다른 테이블이나 인덱스에 영향을 주지 않음
  • 인덱스를 통해 데이터 조회를 위한 SELECT뿐만 아니라 UPDATE와 DELETE의 성능도 향상
  • 기본키로 컬럼 생성시 기본적으로 인덱스가 생성됨

✅ 인덱스 관리

  • 데이터에 변경이 발생하면 최신 상태 유지를 위해 인덱스 관리 필요
  • 테이블에 INSERT 적용시 -> 새로운 데이터에 대한 인덱스 추가
  • 테이블에 UPDATE 적용시 -> 기존의 인덱스는 사용하지 않도록 처리하고, 갱신된 데이터에 대한 인덱스 추가
  • 테이블에 DELETE 적용시 -> 삭제하는 데이터의 인덱스는 사용하지 않도록 처리
    💡 인덱스를 삭제하지 않는 이유 : 삭제하는 과정에서 고비용이 들기 때문에, 사용하지 않도록 처리

✅ 인덱스 장점

  • 테이블 조회 속도 향상
  • 전반적인 시스템 부하 감소

✅ 인덱스 단점

  • 인덱스 관리를 위한 추가 작업이 필요
  • 데이터베이스의 약 10% 정도의 추가 저장 공간 필요
  • 잘못된 인덱스 사용으로 성능이 저하될수도 있음

✅ 인덱스 사용에 적합한 경우

  • 규모가 큰 테이블
  • INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼
  • JOIN이나 WHERE 또는 ORDER BY에 자주 사용되는 컬럼
  • 중복되는 데이터가 최소인 컬럼

✅ 인덱스 자료구조

  • 트리 형태의 자료구조를 주로 사용
  • EX) B * Tree, B+ Tree

  • 인덱스 조회
SELECT * FROM user_indexs;
  • 인덱스 컬럼 조회
SELECT * FROM user_ind_columns; // 인덱스를 갖고 있는 컬럼 조회

✅ 예제와 함께 인덱스 적용

  • 단일 속성 인덱스 생성하기
    문법
    -> CREATE INDEX 생성할인덱스명 ON 대상테이블이름 (대상컬럼이름);
SELECT * FROM customers
WHERE regist_date = '21/01/01';


위 사진과 같이 인덱스를 만들지 않고 조회하면 FULL SCAN으로 조회한 것을 알 수 있다
밑 코드는 customers 테이블의 컬럼인 regist_date를 기준으로 인덱스를 만들겠다

CREATE INDEX regist_date_idx
ON customers (regist_date);

다음은 regist_date 의 인덱스를 만들고 난 후 조회한 결과이다.
사진과 같이 속도도 0.015 -> 0.011 로 빨라졌다
지금은 얼마차이가 나지 않지만, 데이터가 방대해진다면 큰 차이가 발생할 수 있다


  • 다중 속성 인덱스 생성하기
    문법
    -> CREATE INDEX 생성할인덱스명 ON 대상테이블이름 (대상컬럼이름,[.......]);
CREATE INDEX name_idx
ON customers(first_name, last_name)  // 다음과 같이 여러개의 컬럼을 한번에 같은 인덱스로 만들 수 있다

  • 고유 인덱스 생성하기
    문법
    -> 컬럼 자체가 unique 속성을 가지고 있을 때 사용
    (이메일, 전화번호 등 -> 한사람에 하나씩 중복이 없는것들)
    -> CREATE UNIQUE INDEX 생성할인덱스명 ON 대상테이블이름 (대상컬럼이름,[.......]);
    -> 일반 인덱스 생성에서 UNIQUE 명령어만 추가되었다
CREATE UNIQUE INDEX email_idx
ON customers (email); // 이메일 컬럼을 기준으로 고유 인덱스 생성

SELECT * FROM customers WHERE email = 'suan';


✅ 인덱스 삭제

DROP INDEX 인덱스명;

-- ex)
DROP INDEX regist_date_idx;
profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글