[MySQL] 정렬 처리 방식

김기진·2023년 1월 7일
0

MySQL Order By 처리 방식

MySQL 정렬 처리방식에는 다음 3가지 방식이 있다.

explain 을 이용해 쿼리 실행 방식을 조회 했을 때 extra comment 를 통해 쿼리에 사용 되는 정렬 방식을 확인 할 수 있다.

위에서 아래로 갈 수록 처리 속도가 느리고 DB 리소스를 많이 사용 하는 정렬 방식이다.

  • index 를 활용한 정렬 (extra comment 없음)
  • 드라이빙 테이블만 정렬 (using filesort)
  • 임시테이블을 이용한 정렬 (using filesort, using temporary)

index 를 활용한 정렬

쿼리를 실행 하였을 때 이미 인덱스가 정렬이 되어 있어 순서 대로 읽어 오기만 하면 되는 방식으로 가장 이상적인 방법이라고 할 수 있다.

다만, 인덱스를 이용한 정렬 방식을 사용 하기 위해서는 아래의 조건을 만족 해야한다.

  • ORDER BY 에 정의 되어 있는 칼럼이 제일 먼저 읽는 테이블(드라이빙 테이블) 에 속 해 있어야 한다.
  • ORDER BY 순서대로 생성된 인덱스가 존재 해야 한다.
  • WHERE 절에 드라이빙 테이블에 대한 조건이 있다면, WHERE 조건과 ORDER BY 는 같은 인덱스를 사용 할 수 있어야 한다.
  • 해시 인덱스나 전문 검색 인덱스가 아닌 B_TREE 개열의 인덱스를 사용 하여야 한다.

드라이빙 테이블만 정렬

일반적으로 Table Join 을 하게 된다면, 레코드 개수가 몇 배로 불어나기 때문에
Join 이 실행 되기 전에 드라이빙 테이블을 먼저 정렬 하는 방식이다.

Join 이 실행 되기 전에 먼저 정렬이 이루어지므로 임시 테이블은 사용 되지 않는다.

DB 옵티마이저가 드라이빙이블만 정렬 하는 방식을 선택 하기 위해서는 아래의 조건을 만족 해야한다.

  • ORDER BY 에 정의 되어 있는 칼럼이 제일 먼저 읽는 테이블(드라이빙 테이블) 에 속 해 있어야 한다.

임시 테이블을 이용한 정렬

테이블 조인 결과를 임시 테이블에 저장 한 뒤, 그 결과를 임시 테이블에서 정렬 하는 방식이다.

정렬 해야하는 레코드 수가 위에서 설명 한 3가지 방식 중에 제일 많고
임시 테이블 용량이 큰 경우 임시테이블이 디스크에 저장 되어 I/O 부하가 발생 할 수 있는 방법이다.

만약 explain 을 이용해 쿼리 실행 계획을 확인 했을때
extra comment 에 using filesort, using temporary
가 있다면,

Index 생성을 고려하거나, Application Layer 에서 정렬 하는 방법을 고려 해보는 것이 좋다.

profile
back-end-developer

0개의 댓글

관련 채용 정보