DB 인덱스

‍bng4535·2023년 3월 31일
0

index가 중요한 이유

  • 걸려 있지 않다면 full scan으로, O(N)이 걸림
  • 인덱스(B tree기반) 을 사용하면 O(logN)에 처리 가능
  • 조건을 만족하는 튜플을 빠르게 조회하기 위해 인덱스를 사용
  • 빠른 정렬과 그룹 가능

index 거는 법

CREATE INDEX 인덱스_이름 ON 테이블(속성,..);  //해당 속성으로 튜플을 유일하게 구분 X
CREATE UNIQUE INDEX  인덱스이름 ON 테이블(속성,..) 

생성과 동시에 인덱스 추가

CREATE TABLE 테이블명 (
	속성 타입 ,
    ...
    INDEX 인덱스명(속성,..)
    UNIQUE INDEX 인덱스명(속성,..)
)
  • 기본키(primary key)에는 index가 자동 생성된다.

B tree기반 index 동작 방식

  • 해당 컬럼 값을 기준으로 B-트리나 해시 테이블과 같은 트리구조를 생성
  • ex)
    • where a = 70 -> a에 대한 인덱스 생성
    • where a=60 and b=50 -> (a,b)에 대한 인덱스 생성
      즉, WHERE 절에서 자주 사용되는 컬럼이나 컬럼 조합에 대해 인덱스를 생성하면, 데이터 검색 속도를 향상시킬 수 있다.
  • 기본적으로 optimizer가 알아서 적절한 index를 선택해준다
  • 직접 index를 고르고 싶다면?
SELECT * FROM player USE INDEX (인덱스명) WHERE 조건    // 해당 인덱스 사용을 권장
SELECT * FROM player FORCE INDEX (인덱스명) WHERE 조건  // 해당 인덱스 사용을 강제 

index 사용 시 참고 사항

  • index는 막 만들어도 괜찮을까?

    • 인덱스를 만들 때마다 이를 관리하기 위한 부가적인 데이터가 생성(추가적인 저장 공간)
    • 테이블이 수정되면 인덱스의 내용도 변경해주어야 함
    • 불필요한 index를 만들지 말자
  • Covering index

    • 커버링 인덱스는 SELECT 절에서 사용되는 모든 컬럼과 WHERE 절에서 사용되는 컬럼을 포함하는 인덱스
    • 직접 테이블에 접근할 필요가 없으므로 조회 성능이 더 빠르다
  • Hash Index

    • 해시 테이블을 사용하여 index 구현
    • 시간 복잡도 O(1)의 성능
    • equality 비교만 가능, range 비교 불가
  • Full scan이 더 좋은 경우

    • table에 데이터가 조금 있을 때
    • 조회하는 데이터가 테이블의 상당 부분을 차지할 때
    • 판단은 optimizer가 한다
profile
공부 기록

0개의 댓글