본문으로 건너뛰기
🌱 Seed

'Redis 싱글 스레드로 어떻게 그렇게 빠르게 동작할까요?' 영상 정리하기

이영수|2026년 6월 7일|1분 읽기

아티클 주소 :
Redis 싱글 스레드로 어떻게 그렇게 빠르게 동작할까요?

놓치기 쉬운 디테일

이번에, 쿼리 성능을 테스트하면서 사소하지만 놓치기 쉬운 디테일이 있는걸 깨달았다.

select client.id
from client
where client.created_at > ...

먼저 공통 테이블에서 ID를 조회한 뒤,

from feature
where client_id in(?, ?, ?, ...);

다시 feature 테이블을 조회하는 형태의 쿼리가 있었다.

문제는 파티션 키다.

예를 들어 client 테이블이 created_at 기준으로 파티션되어 있는데, 2차 조회에서 client_id in (...)만 사용하면 DB는 해당 ID가 어느 파티션에 있는지 알 수 없다.

각 파티션 내부에서는 인덱스를 탈 수 있어도, 어떤 파티션을 볼지 판단할 수 없어 여러 파티션을 확인하게 된다.

그래서 클라이언트 정보를 추출 할 때

select client.id, client.created_at
from client
LocalDateTime createdAtFrom = createdAtList.stream().min(Comparator.naturalOrder()).orElse(null);
LocalDateTime createdAtTo = createdAtList.stream().max(Comparator.naturalOrder()).orElse(null);

맨 처음, 맨 마지막 created_at 을 추출해서

private BooleanExpression[] clientInfoConditions(ClientFilterParam param) {
    return new BooleanExpression[] {
            goeDateTime(clientInfo.createdAt, param.getClientCreatedAtFromWithMargin()),
            loeDateTime(clientInfo.createdAt, param.getClientCreatedAtToWithMargin())
    };
}
 
public static BooleanExpression goeDateTime(DateTimePath<LocalDateTime> path, LocalDateTime value) {
    return value != null ? path.goe(value) : null;
}
 
public static BooleanExpression loeDateTime(DateTimePath<LocalDateTime> path, LocalDateTime value) {
    return value != null ? path.loe(value) : null;
}

이 값을 2차 조회 조건에 함께 넘긴다.

핵심은 id in (...) 조건은 그대로 유지하고
파티션 프루닝을 돕기 위해 같은 테이블의 파티션 키 조건을 추가하는 것이다.