BKA Join

Hoo-Sung.Lee·2024년 9월 11일
0

Database

목록 보기
17/18
post-thumbnail

등장 배경

기존 NL이나 BNL조인 같은 경우, 필연적으로 드리븐 테이블의 데이터 접근 시 인덱스에 의한 랜덤 엑세스가 발생하므로, 엑세스할 데이터의 범위가 넓다면 분명 비효율적인 조인 방식이다.
이러한 랜덤 엑세스의 단점을 해결하고자 드리븐 테이블에서 접근할 데이터를 미리 예상하고 가져오는 데 착안한 조인 알고리즘을 BKA 조인(Batched Key Access Join)이라고 한다.
BKA 조인은 BNL 조인에서 사용하는 조인 버퍼를 그대로 사용하고 추가적으로 랜덤버퍼, MRR 기술을 통해 최적화를 진행한다.

MRR(Multi Range Read)

MRR은 MySQL 5.6에서 새로 추가된 옵티마이저 기능이다. 보조 인덱스인 Non-Clustered Index에서 Range Scan을 사용하여 테이블의 행을 읽게 되는 경우 테이블에 대한 Random Access가 많이 발생할 수 있게 된다.

아래 이미지가 보조 인덱스에서 Index range scan 이후 테이블에 대해 Random Acces가 발생되는 내용을 표현한 것이다.

MRR은 이러한 Random I/O를 Sequential I/O로 처리할 수 있도록 도와주는 기능으로, Non Clustered Index를 통해 Range Scan을 하는 경우, 바로 데이터를 조회하지 않고 어느 정도 rowid(primary key)값들을 랜덤 버퍼에 채운 다음, 버퍼 내용을 정렬하여 최대한 rowid(primary key) 순서대로 데이터를 접근할 수 있도록 해주는 기능이다.

❗️ 데이터가 완전히 PK 순서대로 저장되어 있는 것은 아니다.
많은 사람들이 데이터 파일의 레코드는 INSERT된 순서대로 저장되는 것으로 생각하지만 그렇지는 않다.
만약 테이블의 레코드를 전혀 삭제하거나 변경하지 않고 INSERT만 수행한다면 맞을 수도 있다.
하지만 레코드가 삭제되어 빈 공간이 생기면 그 다음의 INSERT는 가능한 삭제된 공간을 재활용되도록 DBMS가 설계되기 때문이다.

Disk-Sweep Multi-Range Read(MRR) 최적화를 통해 MySQL은 먼저 인덱스만 스캔하고 관련 행에 대한 키를 수집하여 범위 스캔에 대한 랜덤 디스크 엑세스 수를 줄이려고 한다. 아래 이미지와 같이 버퍼를 통해 키를 정렬하게 되고 기본 키의 순서를 사용하여 테이블에서 행이 겁색하게 된다.
MRR의 목적은 랜덤 엑세스 수를 줄이고 대신 테이블 데이터를 보다 순차적으로 스캔하는 것이다.

참고

MySQL BKA Join

profile
Working towards becoming Backend-Developer

0개의 댓글