개발자
안녕하세요 현재 스프링부트 querydsl로 무한스크롤을 구현하면서 no offset을 적용하고 있습니다.정렬 방식에는 최신순과 마감순이 있는데 최신순은 pk를 오토인크리먼트로해서 사용하면되서 괜찮은데 문제는 마감순입니다. - 마감순정렬조건은 기존에 pk가 오토인크리먼트방식이고 정렬 조건과도 무관해 pk말고 정렬조건이되는 컬럼을 index로 설정을 하려고 합니다! 따라서 마감일로 입력받은 컬럼을 사용하려고 합니다 - 그런데 No offset이 클러스터 인덱스 방식을 쓰기때문에 속도면에서 이점이 있다고 알고 있습니다! - 따라서 클러스터 인덱스를 생성하려면 unique index로 해야하는것 같습니다. 이때, 위에 말씀드린것 처럼 정렬조건이 되는 컬럼을 마감일column으로 잡으려고하는데 이게 unique하지 않을수 있다고 생각이 됩니다(시간이라 중복값이 있을수 있다고 생각) - 따라서 이를 위해 마감일컬럼+pk로 회야할지 아니면 ms초까지(sql은 없고 서버로 받아서) 받아서 datetime이 아닌 varchar타입으로 해야할지 고민이 됩니다! 여기서 제가 착각하고 잘못된 제안을 하고 있는부분이 있는지 아니면 다른 좋은 방법이 있는지 선배님들의 고견을 듣고 싶습니다!
답변 1
무한 스크롤 구현에서 'No Offset' 방식은 'keyset pagination' 혹은 'cursor based pagination' 이라고도 부르며, 이는 매 페이지가 가지는 유니크한 key를 사용해 데이터를 조회하는 방법입니다. 이 방식은 대량의 데이터에서 효율적인 페이징 처리를 가능하게 합니다. 말씀하신 대로, 'No Offset' 방식은 클러스터 인덱스를 사용해서 효율을 높이는데, 클러스터 인덱스는 기본적으로 테이블의 주 키(Primary Key)에 의해 생성되므로 보통 유니크한 값이 됩니다. 그러나, 꼭 주 키가 아니라도 클러스터 인덱스로 설정 가능한 컬럼들이 있으며, 주 키로 설정한 컬럼 뿐만 아니라 다른 컬럼을 추가하여 복합 클러스터 인덱스를 생성하는 것도 가능합니다. 따라서, '마감일 컬럼 + PK'를 사용하여 복합 클러스터 인덱스를 만드는 것이 좋은 해결책이 될 수 있습니다. 이 경우, 마감일이 같은 레코드들이 있더라도 PK 값에 따라 유니크하게 구분이 가능하게 됩니다. 반면, datetime을 varchar로 변경하는 것은 추천드리지 않습니다. 일단, varchar로 변경하면 datetime에서 제공하는 여러가지 함수나 연산을 사용하지 못하게 됩니다. 또한, 저장 공간도 더 많이 차지하게 됩니다. 따라서, '마감일 + PK'로 복합 클러스터 인덱스를 생성하는 것을 추천드립니다. 이렇게 하면, 마감일과 PK를 기반으로 데이터를 빠르게 조회할 수 있으며, 마감일이 같은 레코드들 간의 순서도 PK에 의해 보장됩니다.
커리어리 AI 봇의 답변을 평가해 주세요!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!