2023-java-study / book-study

북 스터디 기록 레포지토리
0 stars 0 forks source link

[9.2.3.3.1 인덱스를 이용한 정렬] 조인 버퍼의 사용과 주의점 #201

Open gmelon opened 10 months ago

gmelon commented 10 months ago

p.297 마지막 부분에 조인이 사용된 쿼리의 실행 계획에 조인 버퍼가 사용되면 순서가 흐트러질 수 있기 때문에 주의해야 한다고 되어 있는데

  1. 조인 버퍼란?
  2. 어떻게 순서가 흐트러지는가?
  3. 순서가 흐트러지는 것에 개발자가 어떤 대비를 할 수 있는가?
NuhGnod commented 10 months ago

https://velog.io/@jsj3282/33.-MySQL-%EC%8B%A4%ED%96%89-%EA%B3%84%ED%9A%8D-MySQL%EC%9D%98-%EC%A3%BC%EC%9A%94-%EC%B2%98%EB%A6%AC-%EB%B0%A9%EC%8B%9D5

위 글이 전체적으로 잘 설명 되어 있네요.

  1. 조인 버퍼란 드라이빙 테이블에서로부터 찾은 레코드를 메모리 캐시에 저장해두는데 이것을 가리키는 말인것 같습니다.
  2. 순서가 흐트러지는 이유는 일반적으로는 드라이빙 -> 드리븐으로 조인되지만, 조인 버퍼에서는 드라이빙 레코드를 쌓아두고, 일치하는 드리븐 레코드와 조인( 드리븐 -> 드라이빙 ) 되어 순서가 바뀌는 것 같습니다.
  3. 조인 버퍼가 사용되는 이유는 드리븐 테이블에서 사용할 수 있는 적절한 인덱스가 없는 상황인 것 같습니다. 그래서 join시 적절한 조인 조건을 건다면 에방 할 수 있을 것 같습니다.
gmelon commented 10 months ago

오.. 신기하군요

결국 실제 드라이빙 테이블의 결과는 조인 버퍼에 담아 두고, 드리븐 테이블을 먼저 읽고 조인 버퍼에서 일치하는 레코드를 찾는 방식 이기 때문에 드리븐 테이블의 순서로 정렬될 수 있다는 거네요

해결책으로 조인 설정외에도 무조건 인덱스 정렬 순서에 의존하지 말고 order by를 명시하는 것도 있을것 같습니다!

ssstopeun commented 10 months ago

달아주신 링크보고 추가적으로 잘 이해가 된것같습니다. 상혁님 말대로 우선 order by를 명시해도 인덱스로 잘 정렬이 되었다면 어짜피 불필요하게 다시 정렬을 안한다고 하니 명시를 해두는 것도 좋은 방법일 것 같습니다.