Open danbi5228 opened 1 year ago
UPDATE 쿼리를 실행하려면?
변경 대상 레코드가 어느 파티션에 저장돼 있는지 찾아야함
WHERE 조건에 파티션 키 칼럼이
조건으로 존재한다면
명시되지 않으면?
UPDATE 쿼리가 어떤 컬럼의 값을 변경하느냐에 따라 실제 레코드를 변경하는 작업에 차이가 있다
파티션 키 이외의 칼럼만 변경될 때
파티션 키 칼럼이 변경될 때
기존의 레코드가 저장된 파티션에서 해당 레코드 삭제
변경되는 파티션 키 칼럼의 표현식을 평가
위 결과를 이용해 레코드를 이동시킬 새로운 파티션을 결정해서 레코드를 새로 저장한다
파티션 테이블을 검색할 때 성능에 크게 영향을 미치는 조건
WHERE 절의 조건으로 검색해야 할 파티션을 선택할 수 있나?
WHERE 절의 조건이 인덱스를 효율적으로 사용(인덱스 레인지 스캔)을 할 수 있나?
두 번째 내용은 일반 테이블의 검색 성능에도 영향을 미치지만 첫 번째 선택사항이 결과에 의해 두 번째 선택사항의 작업 내용이 달라질 수 있다
테이블의 모든 파티션을 대상으로 검색해야 한다
테이블에 존재하는 모든 파티션의 개수만큼 인덱스 레인지 스캔을 수행해서 검색
파티션 개수와 관계없이 검색을 위해 필요한 파티션만 읽으면 된다.
인덱스를 이용할 수 없기 때문에 풀 테이블 스캔
각 파티션의 레코드 건수가 많다면 상당히 느리게 처리될 것
가능하다면 4가지 조합 중 3, 4번 방법은 피하는 것이 좋다
두 번째 조합은 하나의 테이블에 파티션의 개수가 많을 때는 MySQL 서버의 부하도 높아지고 처리 시간도 많이 느려지니 주의
파티션 테이블에서 인덱스는 전부 로컬인덱스에 해당한다
모든 인덱스는 파티션 단위로 생성된다
파티션과 관계없이 테이블 전체 단위로 글로벌하게 하나의 통합된 인덱스를 지원하지 않는 다는 의미
파티션되지 않은 테이블에서는 인덱스를 순서대로 읽으면 그 칼럼으로 정렬된 결과를 바로 얻을 수 있다
하지만 파티션된 테이블에서 인덱스 레이진 스캔을 수행하는 쿼리가 여러 개의 파티션을 읽어야 할 때 결과가 어떻게되나?
여러 파티션에 대해 인덱스 스캔을 수행할 때 각 파티션으로부터 조건에 일치하는 레코드를 졍렬된 순서대로 읽으면서 우선순위 큐에 임시로 저장한다
그리고 우선순위 큐에서 다시 필요한 순서대로(인덱스의 정렬 순서)대로 데이터를 가져간다
옵티마이저에 의해 3개의 파티션 가운데 2개만 읽어도 된다고 판단되면 불필요한 파티션에는 전혀 접근하지 않는다
이렇게 최적화 단계에서 필요한 파티션만 골라내고 불필요한 것들은 실행 계획에서 배제하는것을 파티션 프루닝이라고 한다
EXPLAIN 명령의 결과에서 partitions 칼럼을 살펴보면 쿼리가 어떤 파티션만 조회하는지 확인 할 수 있다
다음 스터디
2023-05-17 pm 10:10 수요일
정리 범위