ORDER BY절과 LIMIT 최적화

Ilyoung Hwang·2022년 1월 19일
0
post-thumbnail

content


MySQL과 MariaDB 에서는 ORDER BY 절을 가진 쿼리가 인덱스를 사용하지 못할때, 실시간 정렬(Using filesort)를 수행한다.


이때에는 조건절에 일치하는 모든 레코드를 가져와서 퀵(Quick sort) 알고리즘을 수행한다.

정렬할 레코드 건이 많을 경우엔 1.소트 버퍼 만큼의 레코드를 모아서 정렬, 2.정렬된 결과를 다시 병합(sort merge pass) 하는 과정을 거치게 된다.


SELECT emp_no, first_name, last_name FROM employees
WHERE emp_no BETWEEN 10001 AND 10900
ORDER BY last_name
LIMIT 10;

위의 쿼리는 10001 부터 10900 까지의 900건의 레코드를 정렬해야 하지만, 최종적으로 10건의 레코드만 반환한다.


최종적으로 반한하는 레코드건수가 적을 경우엔 소프 버퍼에 우선순위큐(Priority Queue)를 만들고 그 큐를 이용해서 정렬을 수행한다.

여기서 가장 중요한 것은 LIMIT n 으로 가져가는 레코드의 바이트 크기가 우선순위 큐가 만들어지는 소트버퍼의 크기보다 작은 경우에만 이 최적화를 적용할 수 있다.

referecne 👉 Real MariaDB
url : http://www.yes24.com/Product/Goods/12653486

0개의 댓글