정렬 설계 체크리스트

정렬 쿼리는 실행 순서가 아니라 결과 계약부터 설계합니다.

사용자가 어떤 순서를 기대하는지, 동점은 어떻게 처리할지, 인덱스가 그 순서를 도와줄 수 있는지를 한 번에 확인합니다.

1

순서를 명시한다

최신순, 가격순, 우선순위순처럼 화면이 기대하는 기준을 SQL에 직접 씁니다.

ORDER BY created_at DESC, id DESC
2

동점을 고정한다

정렬 컬럼 값이 같을 수 있다면 고유 키를 보조 정렬로 넣어 페이지 경계를 안정시킵니다.

ORDER BY price DESC, product_id ASC
3

커서 조건을 맞춘다

keyset pagination은 마지막으로 본 정렬 키 이후를 읽는 방식입니다.

WHERE price < :price
   OR (price = :price AND id > :id)
4

인덱스를 함께 본다

필터 컬럼과 정렬 컬럼 순서가 인덱스와 맞으면 별도 Sort 비용을 줄일 수 있습니다.

INDEX(category, price DESC, id)
5

NULL 위치를 정한다

DBMS마다 NULL 기본 위치가 다르므로 사용자 기준이 있으면 명시합니다.

ORDER BY due_date NULLS LAST
6

실행 계획을 확인한다

대량 데이터에서는 Sort, temp, filesort, 읽은 행 수를 확인하고 인덱스를 조정합니다.

EXPLAIN SELECT ... ORDER BY ...
피하기

ORDER BY 2 같은 컬럼 번호 정렬은 SELECT 목록 변경에 약합니다.

주의

LIMIT만 있는 쿼리는 어떤 행을 가져오는지 보장하지 못합니다.

선택

OFFSET은 관리 화면, keyset은 무한 스크롤과 큰 목록에 어울립니다.