[락 생성]
⭐️ 스케줄러가 실행될 때 중복으로 실행되지 않도록 락을 잡아야함 → 여러 서버에서 스케줄러가 동시에 돌아서 중복실행될 수 있음
[페이징 조회]
페이징 쿼리가 뒤로갈수록 느려지는 구조 - 앞에서 읽었던 행을 다시 읽어야 하기 때문
예를들어 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 수를 고정