과제 내용

KakaoTalk_Photo_2025-05-28-03-32-33.png

아쉬운점 - 개선 사항이 있다면?

[락 생성]

⭐️ 스케줄러가 실행될 때 중복으로 실행되지 않도록 락을 잡아야함 → 여러 서버에서 스케줄러가 동시에 돌아서 중복실행될 수 있음

[페이징 조회]

페이징 쿼리가 뒤로갈수록 느려지는 구조 - 앞에서 읽었던 행을 다시 읽어야 하기 때문

예를들어 offset 10000, limit 20 이라고 하면 최종적으로 10020 개의 행을 읽어야 함

No Offset 구조로 변경

조회 시작 부분을 익덱스로 빠르게 찾아서 매 첫 페이지만 읽도록 하는 방식

select * from notification_history where id < {마지막조회 ID} and client = '' order by created_at desc

커버링 인덱스로 구현

SELECT h.*
FROM notification_history h
JOIN (
    SELECT notification_id
    FROM notification_history
    WHERE client = :client
    ORDER BY created_at DESC
    LIMIT :limit OFFSET :offset
) sub ON h.notification_id = sub.notification_id

count 쿼리 개선

구글처럼 대부분의 조회 요청이 첫 조회에서 발생하고 페이지 버튼을 통한 조회 요청이 소수일 경우 - page 수를 고정