potato.log
로그인
potato.log
로그인
옵티마이저 스위치: MRR과 배치 키 액세스
공부하는 감자
·
2024년 3월 21일
팔로우
0
mysql
0
MySQL
목록 보기
27/74
MRR과 배치 키 액세스
네스티드 루프 조인 (Nested Loop Join)
MySQL 서버에서 지금까지 지원하던 조인 방식
드라이빙 테이블의 레코드를 한 건 읽어서 드리븐 테이블의 일치하는 레코드를 찾아서 조인을 수행하는 방식이다.
드라이빙 테이블: 조인에서 제일 먼저 읽는 테이블
드리븐 테이블: 조인되는 테이블에서 드라이빙이 아닌 테이블들
MySQL 서버의 내부 구조상 조인 처리는 MySQL 엔진이 처리하지만, 실제 레코드를 검색하고 읽는 부분은 스토리지 엔진이 담당한다.
드라이빙 테이블의 레코드 건별로 드리븐 테이블의 레코드를 찾으면, 레코드를 찾고 읽는 스토리지 엔진에서는 아무런 최적화를 수행할 수 없다는 단점이 있다.
Multi-Range Read (MRR)
매뉴얼에서는 DS-MRR (Disk Sweep Multi-Range Read)이라고도 한다.
네스티드 루프 조인의 단점을 보완하기 위해, MySQL 서버는 조인 대상 테이블 중 하나로부터 레코드를 읽어서 조인 버퍼에 버퍼링한다.
즉, 드라이빙 테이블의 레코드를 읽어서 드리븐 테이블과의 조인을 즉시 실행하지 않고 조인 대상을 버퍼링하는 것이다.
조인 버퍼가 가득 차면 MySQL 엔진은 버퍼링된 레코드를 스토리지 엔진으로 한 번에 요청한다.
스토리지 엔진은 읽어야 할 레코드들을 데이터 페이지에 정렬된 순서로 접근해서 디스크의 데이터 페이지 읽기를 최소화할 수 있다.
데이터 페이지가 메모리(InnoDB 버퍼 풀)에 있다고 하더라도 버퍼 풀의 접근을 최소화할 수 있다.
Batched Key Access (BKA)
MRR을 응용해서 실행되는 조인 방식
BKA 조인 최적화는 기본적으로 비활성화돼 있다
BKA 조인을 사용하게 되면 부가적인 정렬 작업이 필요해지면서 오히려 성능에 안 좋은 영향을 미치는 경우도 있기 때문이다.
Reference
참고 서적
📔
Real MySQL 8.0
공부하는 감자
책을 읽거나 강의를 들으며 공부한 내용을 정리합니다. 가끔 개발하는데 있었던 이슈도 올립니다.
팔로우
이전 포스트
고급 최적화
다음 포스트
옵티마이저 스위치: 블록 네스티드 루프 조인
0개의 댓글
댓글 작성