본문 바로가기
CS/Database

RDB Index

by clearinging 2021. 12. 9.
반응형

성능 이슈발생 원인

  • 대부분 성능 이슈는 index 선언과 잘못된 query문으로 인해 slow 이슈가 발생하게됩니다.
  • 부수적으로 replication과 리눅스 connection개수와 같은 여러 방식으로 성능 이슈를 해결하는 경우도있지만 애플리케이션에서 index와 slow 쿼리를 빠르게 찾는게 중요합니다.

간단한 용어 정리

  • 카디널리티: 겹치지 않는 row의 수
  • 선택도
    • 카디널리티를 전체 조회된 데이터 개수로 나눈것 : 카디널리티/전체row수
    • 1에 근접할 수록 좋습니다.
  • 분포도: 특정 컬럼에 대해서 전체 건수 대비 특정 값이 차지하는 비율(만약 Y/N이고 100개중 50/50비율이면 50%입니다)

Index

정의

  • Database의 데이터를 빠르게 찾기 위해서 사용하는 테이터 구조
  • MySQL innoDB에서는 default로 B-Tree형태를 가짐

특징

  • 조회 시간 단축
  • 주로 B-Tree구조(Balanced-Tree)를 사용해서 binary search 형태로 진행
    • leaf node끼리는 double linked list형태로 이뤄져있습니다.
    • fullscan이 이뤄질때는 linkedlist를 타서 성능을 올리려고 노력합니다.
  • 만약 조회 데이터가 전체 데이터의 50%가 넘을 경우 full scan으로 자동으로 처리한다

Index 종류

  • 클러스티드 Index
  • Non 클러스티드 index

Clusted Index

정의

  • 메모리에 순차적으로 저장되는 인덱스
  • 물리적인 DB에서 비슷한 데이터끼리는 모여 있는 것을 의미
  • 물리적으로 이미 Index에 맞춰서 정렬되어있음
  • leaf node에는 실제 row 데이터를 저장하여 pk혹은 unique key가 clustered key 역할을 수행
  • 테이블 당 1개를 가지게된다.
  • 선택도가 30%이내에서 사용하는 것을 추천합니다.
  • InnoDB에서는 default로 clusted Index로 설정이 이뤄짐
  • oracle인 경우 insert를 최대한 빠르게 하기 위해서 사용하는 DB입니다. 그러므로 clustered index는 선택 사항입니다.
    • oracle은 clustered index가 있더라도 물리적으로 위치를 순차적으로 저장하진 않습니다.

최대 생성 개수

  • 최대 1를 설정하는게 유리합니다
  • 만약 2개의 클러스터 인덱스가 있다면 정렬의 규칙을 설정하기 매우 까다로워 집니다.

Non Clusted Index

정의

  • Table에서 Column에 대한 Index를 추가하는 것을 의미
  • CREATE INDEX를 통해서 만단 Index는 Non clusted Index이다
  • leaf node에 row id값이나 pk 값을 가집니다.
  • 그러므로 non clusted index를 통해 조회가 이뤄지면 pk값을 획득하고 clustered index에 다시 조회해 데이터를 가져옵니다.

index 사용방식

최대 생성 개수

  • 여러개 생성 가능
  • 하지만 인덱스 저장과 삭제로인해서 DB삭제 추가에 오버 헤드가 발생 하기 때문에 필요한 요구사항에 적절하게 선언하는게 중요합니다.

복합 Index

정의

  • 2가징 이상의 column을 index로 설정하는 것을 의미

중요한 부분

  • 복합 index는 like, 비교연산(<, <=, >=, >) 와같은 조건이 있으면 해당 컬럼 뒤에 선언된 index는 index를 사욯하지 못하니다.
  • 예시
SELECT * 
FROM team t INNER JOIN member m
ON t.팀코드 = m.팀코드
WHERE m.맴버번호 > "C" AND m.이름 = "DDD";

라는 query가 들어왔다가 가정 합니다.

  • 맴버번호, 이름순으로 index가 선어되어있을 경우
    • 처음에 맴버 번호로 먼저 index를 사용해 조회를 합니다.
    • 노란색으로 조회 된데이터를 memory에 올립니다
    • 이름을 모든 row를 loop돌면선 DDD인 것을 찾습니다.

  • 이름, 맴버번호순으로 index가 선언되어있을 경우
    • 처음에 DDD로 이름을 먼저 조회 합니다. 그리고 그 다음 index를 통해서 정렬 되어있기 때문에 바로 random access로 데이터 row에 접근할 수 있습니다.

 

반응형

'CS > Database' 카테고리의 다른 글

Replica 싱크 불일치 이슈  (0) 2022.04.07
RDB Semi Join을 이용한 성능 최적화  (0) 2021.12.12
RDB Join 방식  (0) 2021.12.09
NamingLock을 이용한 동시성 이슈, Deadlock query 이슈 해결  (0) 2021.12.01
DB Isolation  (0) 2021.10.30