본문 바로가기
데이터베이스

[DB] 인덱스란?

by 커피는아아 2021. 9. 5.
반응형

1. 인덱스란?

  • 데이터 행의 검색 속도를 향상시키기 위해서 사용되는 데이터베이스 객체다
  • 인덱스는 테이블과 독립적으로 존재한다

2. 인덱스가 왜 필요할까?

Full Table Scan

  • 대용량 데이터에 조회 비효율적이다.

Index Range scan

  • 인덱스 설정 할 시에 조회 성능이 좋아진다
    • 10만건 기준 5.62s -> 0.01s

3. 인덱스의 구조와 원리

  • B+-Tree 인덱스 구조를 가진다.

4. 인덱스를 언제 쓰는 게 좋을까?

  1. where 절이나 조인조건에 자주 사용되는 경우
  2. 컬럼이 매우 다양한 값을 포함하고 있는 경우 (남녀 이런건 별로)
  3. 데이터가 아주 많은 테이블을 대상으로 조회작업을 했을 때 대부분의 조회작업에서= 검색되는 행이 전체 데이터의 10%미만인 경우
  4. 인덱스 생성이 필요하지 않는 경우
    • 테이블이 작은 경우
    • 테이블이 자주 갱신되는 경우 (Insert update delete)
    • 인덱스화된 열이 표현식의 일부로 사용되는 경우
    • where절의 조회 조건으로 자주 사용되지 않는 경우
    • 대부분의 조회작업에서 전체 데이터의 10%이상 검색되는 경우

5. 인덱스 생성

  1. 자동 생성값들은 자동으로 인덱스가 생성된다.
  2. 테이블 정의할 때 primary key 제약조건, unique 제약조건이 정의된 컬럼의
  3. 수동 생성
    • 사용자가 행에 대한 엑세스 시간을 줄이기 위해서 특정 열을 대상으로 인덱스를 생성할 수 있다.
  • 인덱스 생성하기
  • create index 인덱스명 on 테이블명 (컬럼명, ....)
  • 인덱스 삭제하기
  • DROP INDEX 인덱스명

6. 인덱스 사용

  • optimizer가 알아서 실행
  • /힌트 사용/
  • 주의 사항
1. 인덱스 컬렁 가공
ex) where substr(order_no, 1, 4) = '2021' -> where order_no like '2021%'

2. 인덱스 컬럼의 묵시적 형변환 (같은 타입으로 비교해야 함)
ex) where reg_date = '19930331' -> where reg_date = TO_DATE('19930331','YYYYMMDD')

3. 인덱스 컬럼 부정형 비교
ex) where mem_type != '10' -> where mem_type in ('20','30')

4. LIKE 연산자 사용 시 %가 앞에 위치

5. OR 조건 사용 -> UNION ALL로 대체

7. 인덱스 Column설정 기준

  • Cardinality(기수성)가 높은 것
  • the number of elements in a set or group (요소 수)

8. Clustered Index

  • PK를 지정하면 자동적으로 Clustered Index가 생성 된다.
  • 테이블당 한 개만 생성이 가능
  • 행 데이터를 인덱스로 지정한 열에 맞춰서 자동 정렬함

생각

pk를 email로 설정했을 때 (즉 인덱스컬럼이 email일 때) 발생할 수 있는 성능 이슈는?

@Id
@NotBlank
@Email
private String email;

추가적으로

  • NonClustered Index
  • Compositive key

참고

https://www.youtube.com/watch?v=9ZXIoh9PtwY

https://www.youtube.com/watch?v=NkZ6r6z2pBg

https://www.youtube.com/watch?v=GiDSXaaHoWA