인프런 커뮤니티 질문&답변
커서 기반 페이징 조건 대상으로 AUTO_INCREMENT vs ULID
해결된 질문
작성
·
16
0
13강 7분 30초 경부터 말씀해주시는 내용을 정리해보면
"커서 기반 페이징 조건 대상은 순차적인 값이어야 한다. AUTO_INCREMENT 설정 컬럼은 순차성이 깨질 수 있는 가능성이 있기에 그보다는 ULID가 권장된다."
라는 이야기로 정리해볼 수 있는데요. 여기서 Hong님께서 순차적인 값이어야 한다고 알려주신 이유가 무엇인지 궁금합니다.
커서 기반 페이징을 하기 위해서는 조건 대상이 다음과 같은 사항만 만족하면 되지 않을까요?
유니크해야 한다 - 같은 값이 여러 행에 있으면 커서가 모호해짐
정렬 가능해야 한다 -
>,<비교 연산이 의미 있어야 함
답변 2
1
안녕하세요 제우님 질문 주셔서 감사합니다.
일단 커서 기반의 페이징은 쉽게 말하면 WHERE 조건절에 값을 추가함으로써 탐색하는 Raw의 갯수를 줄이는 대표적인 튜닝 기법입니다.
MySQL의 쿼리 실행순서가 우선 WHERE 조건 절이 동작한다는 부분을 이용하는거죠.
그래서 본질은 "마지막으로 본 지점 이후의 데이터를 이어서 본다" 라는걸 이해하셔야 해요.
이 명제가 성립하려면, 제우님이 말씀해주신 조건(유니크하고 정렬 가능함)에 더해, 값이 단조적으로 증가해야 한다는 전제가 필요합니다.
단순히 숫자가 증가하는 것처럼 보이더라도, 중간 값이 비어 있다는 것은 곧 삽입과 값의 흐름이 완전히 일치하지 않을 가능성을 배제 할 수 없다는거에요. 예를 들어 AUTO_INCREMENT 컬럼에서 트랜잭션이 롤백되거나, 동시성 환경에서 먼저 번호를 선점한 트랜잭션이 나중에 커밋되는 상황이 발생할 수도 있고요. 이 경우 숫자는 증가하지만 실제 데이터가 생성된 시간 순서와 값의 순서가 어긋날 수 있습니다.
기본적으로 WHERE id > last_id 이 조건이 안전하려면 last_id 이후에 생성된 데이터는 반드시 id 값도 더 커야 한다는 보장이 필요한데.... 중간 값이 비어 있게 된다면 어떤 값이 건너 뛰어졌거나 순서가 엇갈릴 수 있다는걸 의미하고 이게 곧 값이 증가한다는게 생성하는 순서가 맞다라는 가정이 성립하지 않는다는 관점으로 이해하시면 좋을꺼 같아요.
즉 그래서 예시를 들어보자면
사용자가 1페이지, 2페이지를 조회한 이후 새로운 데이터가 들어왔는데, 그 데이터의 값이 이미 지나간 구간에 속해버린다면 해당 데이터는 영원히 노출되지 않을 수 있는거죠. 커서 기반 페이징은 OFFSET처럼 다시 처음부터 훑는 방식이 아니기 때문에, 한 번 지나간 구간은 다시 탐색하지 않는다는 특징이 있기 떄문이에요.
어떻게 이해가 좀 되셨을까요?? 혹시 이해가 안되는 부분이 있다면 편하게 질문 주세요. 감사합니다!
0
안녕하세요, 인프런 AI 인턴입니다. 신제우님.
커서 기반 페이징에 대해 질문을 주셨네요. 이 질문은 데이터베이스의 페이징 방식 중 하나인 커서 기반 페이징을 구현할 때 고려해야 할 사항에 관한 것입니다.
커서 기반 페이징에서 순차적인 값이 필요한 이유
순차성과 일관성:
- 데이터베이스에서 커서 기반 페이징을 사용할 때, 성능 효율성을 위해 순차적으로 정렬된 데이터를 기반으로 커서를 운용합니다. 이렇게 하면 데이터 삽입이나 삭제가 빈번하더라도 페이지 간의 일관된 순서를 유지할 수 있습니다.
- ULID(Universally Unique Lexicographically Sortable Identifier)는 시간 기반의 순차성을 갖고 있으면서도 전역적으로 고유한 값을 제공합니다. 이는 AUTO_INCREMENT에서 발생할 수 있는 중복이나 불일치 문제를 해결하는 데 유리합니다.
- 데이터베이스에서 커서 기반 페이징을 사용할 때, 성능 효율성을 위해 순차적으로 정렬된 데이터를 기반으로 커서를 운용합니다. 이렇게 하면 데이터 삽입이나 삭제가 빈번하더라도 페이지 간의 일관된 순서를 유지할 수 있습니다.
페이징 성능:
- AUTO_INCREMENT는 데이터가 삽입되는 순서에 기반한 값입니다. 삽입이 예상하지 못한 순서로 수행되거나 중간에 값이 삭제될 경우, 그 순차성이 깨질 수 있습니다.
- ULID는 이런 상황에서도 고유성과 정렬 가능성을 보장하기 때문에 커서 기반 페이징에 적합합니다.
- AUTO_INCREMENT는 데이터가 삽입되는 순서에 기반한 값입니다. 삽입이 예상하지 못한 순서로 수행되거나 중간에 값이 삭제될 경우, 그 순차성이 깨질 수 있습니다.
유니크성과 정렬 가능성:
- 커서 기반 페이징을 사용할 때, 각 레코드를 구분하고 정확하게 이어지는 레코드를 가져오기 위해 유니크하고 정렬 가능한 값이 필요합니다. 이는 커서가 데이터를 스캔하면서 사용되는 기준점이기 때문입니다.
- 커서 기반 페이징을 사용할 때, 각 레코드를 구분하고 정확하게 이어지는 레코드를 가져오기 위해 유니크하고 정렬 가능한 값이 필요합니다. 이는 커서가 데이터를 스캔하면서 사용되는 기준점이기 때문입니다.
관련하여 더 깊은 이해를 위해, 아래 링크에서 커서 기반 페이징과 관련된 추가 정보를 참조하시기 바랍니다:
위 링크에서는 MySQL의 페이징 기술과 인덱스 최적화 방법에 대한 심층적인 설명을 다루고 있습니다. 강의 내용을 바탕으로 커서 기반의 페이징에 대해 더 깊이 이해하실 수 있으리라 믿습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.




