옵티마이저 스위치: MRR과 배치 키 액세스

공부하는 감자·2024년 3월 21일
0

MySQL

목록 보기
27/74
post-thumbnail

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

profile
책을 읽거나 강의를 들으며 공부한 내용을 정리합니다. 가끔 개발하는데 있었던 이슈도 올립니다.

0개의 댓글