mojh7 / real-mysql-study

:orange_book: Real MySQL 8.0 study
0 stars 0 forks source link

2023/05/11 ~ 2023/05/17 #52

Open danbi5228 opened 1 year ago

danbi5228 commented 1 year ago

다음 스터디

2023-05-17 pm 10:10 수요일

정리 범위

  1. 13.1 ~ 13.1.2.1
  2. 13.1.2.2 ~13.1.2.5
github-actions[bot] commented 1 year ago

정리 범위 무작위 선택 봇 🔎

  1. 단비
  2. 장현
danbi5228 commented 1 year ago

13. 파티션

13.1 개요

13.1.1 파티션을 사용하는 이유

13.1.1.1 단일 INSERT와 단일 또는 범위 SELECT의 빠른 처리

13.1.1.2 데이터의 물리적인 저장소를 분리

13.1.1.3 이력 데이터의 효율적인 관리

13.1.2 MySQL 파티션의 내부 처리

13.1.2.1 파티션 테이블의 레코드 INSERT

mojh7 commented 1 year ago

13.1.2.2 파티션 테이블의 UPDATE

UPDATE 쿼리를 실행하려면?

조건으로 존재한다면

명시되지 않으면?


UPDATE 쿼리가 어떤 컬럼의 값을 변경하느냐에 따라 실제 레코드를 변경하는 작업에 차이가 있다

파티션 키 이외의 칼럼만 변경될 때

파티션 키 칼럼이 변경될 때

  1. 기존의 레코드가 저장된 파티션에서 해당 레코드 삭제

  2. 변경되는 파티션 키 칼럼의 표현식을 평가

  3. 위 결과를 이용해 레코드를 이동시킬 새로운 파티션을 결정해서 레코드를 새로 저장한다


13.1.2.2 파티션 테이블의 검색

파티션 테이블을 검색할 때 성능에 크게 영향을 미치는 조건

  1. WHERE 절의 조건으로 검색해야 할 파티션을 선택할 수 있나?

  2. WHERE 절의 조건이 인덱스를 효율적으로 사용(인덱스 레인지 스캔)을 할 수 있나?

두 번째 내용은 일반 테이블의 검색 성능에도 영향을 미치지만 첫 번째 선택사항이 결과에 의해 두 번째 선택사항의 작업 내용이 달라질 수 있다


1. 파티션 선택 가능 + 인덱스 효율적 사용 가능

2. 파티션 선택 불가 + 인덱스 효율적 사용 가능

3. 파티션 선택 가능 + 인덱스 효율적 사용 불가

4. 파티션 선택 불가 + 인덱스 효율적 사용 불가


가능하다면 4가지 조합 중 3, 4번 방법은 피하는 것이 좋다

두 번째 조합은 하나의 테이블에 파티션의 개수가 많을 때는 MySQL 서버의 부하도 높아지고 처리 시간도 많이 느려지니 주의


13.1.2.4 파티션 테이블의 인덱스 스캔과 정렬

파티션 테이블에서 인덱스는 전부 로컬인덱스에 해당한다


파티션되지 않은 테이블에서는 인덱스를 순서대로 읽으면 그 칼럼으로 정렬된 결과를 바로 얻을 수 있다

하지만 파티션된 테이블에서 인덱스 레이진 스캔을 수행하는 쿼리가 여러 개의 파티션을 읽어야 할 때 결과가 어떻게되나?

여러 파티션에 대해 인덱스 스캔을 수행할 때 각 파티션으로부터 조건에 일치하는 레코드를 졍렬된 순서대로 읽으면서 우선순위 큐에 임시로 저장한다

그리고 우선순위 큐에서 다시 필요한 순서대로(인덱스의 정렬 순서)대로 데이터를 가져간다


13.1.2.5 파티션 프루닝

옵티마이저에 의해 3개의 파티션 가운데 2개만 읽어도 된다고 판단되면 불필요한 파티션에는 전혀 접근하지 않는다

이렇게 최적화 단계에서 필요한 파티션만 골라내고 불필요한 것들은 실행 계획에서 배제하는것을 파티션 프루닝이라고 한다

EXPLAIN 명령의 결과에서 partitions 칼럼을 살펴보면 쿼리가 어떤 파티션만 조회하는지 확인 할 수 있다