해결된 질문
작성
·
183
·
수정됨
0
안녕하세요 강사님! 실행 계획 type에 대해서 궁금한 점이 있습니다. ref가 UNIQUE가 아닌 컬럼의 인덱스를 사용한 경우라고 해주셨는데, 그러면 UNIQUE가 아닌 컬럼의 인덱스이지만 index나 range의 경우에 해당하면 해당 타입으로 표시되는 거고 저 둘(index, range)이 아닐 때, ref 타입으로 표시되는 걸까요?
그리고 한 가지 더 궁금한 점이 있는데, 만약 데이터를 조회한 결과들을 바로 View로 보내는 게 아니고 자바 코드를 사용한 계산을 통해 가공해야 하는 상황이라면 굳이 ORDER BY를 쓰지 않고, 데이터 조회 후, Collections.sort()와 같은 자바 코드로 정렬하는 편이 나을까요?
답변 1
2
안녕하세요 fnelclsrn123님! 질문해주신 내용에 대해 하나씩 답변 드려볼게요:)
실행 계획 type에 대해서 궁금한 점이 있습니다. ref가 UNIQUE가 아닌 컬럼의 인덱스를 사용한 경우라고 해주셨는데, 그러면 UNIQUE가 아닌 컬럼의 인덱스이지만 index나 range의 경우에 해당하면 해당 타입으로 표시되는 거고 저 둘(index, range)이 아닐 때, ref 타입으로 표시되는 걸까요?
-> 네, 대부분의 경우에는 ref 타입으로 표시됩니다.
그렇다보니 처음 공부하실 때는 말씀해주신 대로 이해하셔도 됩니다!
나중에 조금 더 깊이 있게 공부하실 때는 MySQL의 공식문서를 통해
어떤 상황에 ref가 표시되는 지 추가적으로 공부하셔도 좋을 것 같습니다.
https://dev.mysql.com/doc/refman/8.4/en/explain-output.html#explain-join-types
만약 데이터를 조회한 결과들을 바로 View로 보내는 게 아니고 자바 코드를 사용한 계산을 통해 가공해야 하는 상황이라면 굳이 ORDER BY를 쓰지 않고, 데이터 조회 후, Collections.sort()와 같은 자바 코드로 정렬하는 편이 나을까요?
-> 훌륭한 질문이네요! DB에서 처리했을 때 비효율적인 작업은 애플리케이션 레벨(자바 단)에서 작업을 처리하는 식으로 구성하기도 합니다. 하지만 일반적으로 정렬 작업(ORDER BY)은 DB가 더 효율적으로 처리할 수 있을 때가 많습니다.
예를 들어, 10만 건의 데이터 중에서 생년월일이 가장 빠른 사용자를 찾아야 한다고 가정해봅시다. 자바 애플리케이션에서 이 과정을 수행하려면 10만 건의 데이터를 다 불러온 뒤에 Collections.sort()를 해야 할 겁니다. 오히려 애플리케이션 단에 10만 건의 데이터를 불러온다는 것 자체가 성능상의 비효율을 초래할거에요. 그러다보니 정렬(ORDER BY) 작업은 애플리케이션 단보다 DB에서 처리를 하는 편이기도 합니다:)
이 외로 궁금하신 점 있으시면 편하게 질문 남겨주세요~~
명확한 답변 감사드립니다!