DB/sql

강성욱 님 데이터 패던 access

wooweee 2023. 5. 26. 18:13
728x90

시중 책에 없다

공부할게 많다는 뜻

db에서 네트워크, 쿼리, 

왜 빠른가?

 

https://sungwookkang.com access pattern  data structure

 

optimal path?

- 최적화

-최단거리

db base 쿼리가 빠르냐 느리냐 옵티마이저(디비의 뇌)로 참조

 

튜닝 포인트

- 비즈니스 얼마나 아느냐, 알고리즘가지고는 택도 없다

- ㅇ

 

튜닝의 목적: 일관된 성능, 꾸준히 평균이 이렇게 나온다. 그니깐 100page 100000호출이 더 효율적

디비 튜닝은 하드웨어 친화적 특히 I/o

 

튜닝을 잘하기 위해서

기계가 생각하는 방식으로 튜닝 해야한다. (optimisal 을 위한)

 

table: data가 저장되는 가장 적은 공간

- heap 바이너리가 저장된 것. heap table이라고 한다.

인덱스를 넣으면 클러스터(정렬) 인덱스 구조가 된다.

 

클러스터(index) - heap  table 구조

인덱스 유무에 따라 이름 달라짐

 

data page Structure

  • 디스크에 실제로 쓰이는 저장 단위
    • page : sql 서버 기본 저장 단위
    • 1page : 8k

 

extents

page가 8개가 모이면 extents라고 한다. - 논리적으로 연속된 8개 페이지 묶음

믹스 extents

유니폼 extenst

인덱스를 잘못잠기면 extensts를 묶음이 다 lock이 걸리는 문제 가 생간다.

 

  • 페이지 타입
    • data
    • index
    • text/image : 큰 데이터 형식 받을 때 - 참조변수의 주소값을 넣어준다. 원래는 8k 이하면 공간에 값이 들어가는데 이런거는 따로 저장된 주소에 들어간다
    • pfs
    • iam

 

 

index

  • table
    • heap
      • 뭐였지
    • clustered index
      • b tree

clustered index(정렬)

  • index는 abc순서대로 해야하므로 웬만하면 정렬이 보장된 데이터를 원함
  • cluster은 pk가 아니므로 유니크하지 않다. 그래서 숨겨진 4byte가 있어서 유니크 cluster을 사용 권장

 

non clustered index

  • table과 별개로 인덱스 키로만 구성된 별도의 b tree 인덱스 영역
  • mysql 에서 pk
  • 2개 개념 중요
    • non cluster index (heap) 
    • non cluster index (cluster) 

 

 

 

 

b tree에 데프리??/ 가 중요하데///

rdb는 컬럼 순서가 상관 없다.

 

 

 

  • access type
    • sequence access 데이터를 차례대로 읽음 / 큰 범위 검색 유리 포인트로 읽을 때 불필요한 데이터 까지 읽음, 데ㅐ이터 많을 수록, 시작점점 문제
    •  random access?????????????????
  • scan
    • 테이블 전체 또는 인덱스의 리프 레벨을 모두 읽는 방식
    • 할당 순서 scan
    • 인덱스 정렬 scan
  • seek
    • index 트리 타고 하나의 값을 검색하는 방식
    • seek scan
  • lookup
    • non cluster index
    • key lookup: index 영역에서 검색
    • rib lookup - heap 영역에서 검색
  • covered index - lookup 발생 안함 / 컬럼 합치면서 유니크해질수 있어서

  • selectivity - 비율이 낮을 수록 좋다

 

 

  • access patterns type
    • table scan: 힙 구조 scan함 / 소형 table은 걍 스캔 때리고 상황마다 다름
    • 클러스터 인덱스 스캔
    • db에서 굳이 정렬해서 읽지마 - order by 조심해 -> 받아내고 app에서 정렬하는게 비용을 줄인다.
    • 정렬이 정말 보장되기 위해선 order by 사용 - 클러스터 table이여도 필요함
    • 페이지 스플릿
    • db sequence + uuid (app 에서 사용)
    • coverd index scan
    • 데이터를 정렬된걸 가져올 때 order by 비용 == sort비용이 있으면 index로 정렬된 column을 order by로 사용해야 sort 비용을 줄일 수 있다.

 

index, orderby, in (), <, seek, scan, cluster, 등등 으로 튜닝을 하네?

range Scan, lookup-없는거 찾는거

 

 

그때 2가지 꼭 나중에 알아야된다는 거 - 정규화랑 동일함

클러스-넌클러스

넌클러스-클러스

 

 

db의 i/o 비용은 고객이 들어올때 비례하게 오르는게 아니라 로켓곡선을 그려서 ㅁ