정렬 실무

정렬은 보기 순서를 정하는 문법이 아니라, 어떤 순서로 얼마나 읽을지 결정하는 기준입니다.

ORDER BY가 없으면 결과 순서는 보장되지 않습니다. 그다음 실무 포인트는 어디서 멈출지같은 순서를 인덱스로 읽게 할 수 있는지입니다.

1

먼저 결과 순서를 고정

화면과 API가 기대하는 정렬 기준을 먼저 명시해야 이후 LIMIT, 페이지 이동, 재조회가 같은 규칙을 따릅니다.

ORDER BY avg_price DESC, product_id DESC
같은 평균가가 여럿이면 보조 키까지 함께 적어야 매번 같은 순서로 잘립니다.
`ORDER BY`가 없으면 DBMS는 저장 순서나 실행 계획에 따라 다른 순서를 반환할 수 있습니다.
2

필요한 범위까지만 읽기

정렬 뒤에 어떻게 멈추느냐가 읽는 행 수를 바꿉니다. 작은 TOP-N과 깊은 페이지는 같은 방식으로 다루지 않습니다.

TOP-N
앞쪽 몇 건만 보면 `LIMIT`으로 바로 멈춘다

예: 가장 비싼 카테고리 5개, 최신 글 20개

LIMIT 5
깊은 페이지
`OFFSET`은 뒤로 갈수록 앞부분을 계속 건너뛴다

`OFFSET 10000 LIMIT 20`은 10000건을 읽고 지나간 뒤 20건만 반환합니다.

WHERE (avg_price, product_id) < (?, ?) LIMIT 20
3

같은 순서를 인덱스가 제공하게 맞춘다

정렬 컬럼의 순서와 방향이 인덱스와 맞으면 별도 정렬 부담이 줄고, LIMIT 지점에서 더 빨리 멈출 수 있습니다.

INDEX(avg_price DESC, product_id DESC)
정렬 순서 + 방향 + 보조 키가 쿼리와 맞아야 인덱스 리프 순서를 그대로 재사용할 수 있습니다.
정렬 성능이 중요할수록 쿼리만 보지 말고, 그 순서를 뒷받침하는 인덱스를 함께 설계해야 합니다.
핵심

순서를 명시하고, 깊은 페이지는 커서 기준으로 넘기고, 인덱스가 그 순서를 그대로 제공하게 맞추면 정렬 쿼리는 더 안정적이고 더 싸게 실행됩니다.