강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

신제우님의 프로필 이미지
신제우

작성한 질문수

5천억건이 넘는 금융 데이터를 처리하는 토스 개발자에게 배우는 MySQL

복잡한 서비스 데이터를 위한 SELECT 고급화 기법

커서 기반 페이징 조건 대상으로 AUTO_INCREMENT vs ULID

해결된 질문

작성

·

16

0

13강 7분 30초 경부터 말씀해주시는 내용을 정리해보면

"커서 기반 페이징 조건 대상은 순차적인 값이어야 한다. AUTO_INCREMENT 설정 컬럼은 순차성이 깨질 수 있는 가능성이 있기에 그보다는 ULID가 권장된다."

라는 이야기로 정리해볼 수 있는데요. 여기서 Hong님께서 순차적인 값이어야 한다고 알려주신 이유가 무엇인지 궁금합니다.

커서 기반 페이징을 하기 위해서는 조건 대상이 다음과 같은 사항만 만족하면 되지 않을까요?

  • 유니크해야 한다 - 같은 값이 여러 행에 있으면 커서가 모호해짐

  • 정렬 가능해야 한다 - >, < 비교 연산이 의미 있어야 함

답변 2

1

Hong님의 프로필 이미지
Hong
지식공유자

안녕하세요 제우님 질문 주셔서 감사합니다.

 

일단 커서 기반의 페이징은 쉽게 말하면 WHERE 조건절에 값을 추가함으로써 탐색하는 Raw의 갯수를 줄이는 대표적인 튜닝 기법입니다.

  • MySQL의 쿼리 실행순서가 우선 WHERE 조건 절이 동작한다는 부분을 이용하는거죠.

 

그래서 본질은 "마지막으로 본 지점 이후의 데이터를 이어서 본다" 라는걸 이해하셔야 해요.

이 명제가 성립하려면, 제우님이 말씀해주신 조건(유니크하고 정렬 가능함)에 더해, 값이 단조적으로 증가해야 한다는 전제가 필요합니다.

 

단순히 숫자가 증가하는 것처럼 보이더라도, 중간 값이 비어 있다는 것은 곧 삽입과 값의 흐름이 완전히 일치하지 않을 가능성을 배제 할 수 없다는거에요. 예를 들어 AUTO_INCREMENT 컬럼에서 트랜잭션이 롤백되거나, 동시성 환경에서 먼저 번호를 선점한 트랜잭션이 나중에 커밋되는 상황이 발생할 수도 있고요. 이 경우 숫자는 증가하지만 실제 데이터가 생성된 시간 순서와 값의 순서가 어긋날 수 있습니다.

 

기본적으로 WHERE id > last_id 이 조건이 안전하려면 last_id 이후에 생성된 데이터는 반드시 id 값도 더 커야 한다는 보장이 필요한데.... 중간 값이 비어 있게 된다면 어떤 값이 건너 뛰어졌거나 순서가 엇갈릴 수 있다는걸 의미하고 이게 곧 값이 증가한다는게 생성하는 순서가 맞다라는 가정이 성립하지 않는다는 관점으로 이해하시면 좋을꺼 같아요.

 

즉 그래서 예시를 들어보자면

 

사용자가 1페이지, 2페이지를 조회한 이후 새로운 데이터가 들어왔는데, 그 데이터의 값이 이미 지나간 구간에 속해버린다면 해당 데이터는 영원히 노출되지 않을 수 있는거죠. 커서 기반 페이징은 OFFSET처럼 다시 처음부터 훑는 방식이 아니기 때문에, 한 번 지나간 구간은 다시 탐색하지 않는다는 특징이 있기 떄문이에요.

 

어떻게 이해가 좀 되셨을까요?? 혹시 이해가 안되는 부분이 있다면 편하게 질문 주세요. 감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다. 신제우님.

커서 기반 페이징에 대해 질문을 주셨네요. 이 질문은 데이터베이스의 페이징 방식 중 하나인 커서 기반 페이징을 구현할 때 고려해야 할 사항에 관한 것입니다.

커서 기반 페이징에서 순차적인 값이 필요한 이유

  1. 순차성과 일관성:

    • 데이터베이스에서 커서 기반 페이징을 사용할 때, 성능 효율성을 위해 순차적으로 정렬된 데이터를 기반으로 커서를 운용합니다. 이렇게 하면 데이터 삽입이나 삭제가 빈번하더라도 페이지 간의 일관된 순서를 유지할 수 있습니다.
    • ULID(Universally Unique Lexicographically Sortable Identifier)는 시간 기반의 순차성을 갖고 있으면서도 전역적으로 고유한 값을 제공합니다. 이는 AUTO_INCREMENT에서 발생할 수 있는 중복이나 불일치 문제를 해결하는 데 유리합니다.
  2. 페이징 성능:

    • AUTO_INCREMENT는 데이터가 삽입되는 순서에 기반한 값입니다. 삽입이 예상하지 못한 순서로 수행되거나 중간에 값이 삭제될 경우, 그 순차성이 깨질 수 있습니다.
    • ULID는 이런 상황에서도 고유성과 정렬 가능성을 보장하기 때문에 커서 기반 페이징에 적합합니다.
  3. 유니크성과 정렬 가능성:

    • 커서 기반 페이징을 사용할 때, 각 레코드를 구분하고 정확하게 이어지는 레코드를 가져오기 위해 유니크하고 정렬 가능한 값이 필요합니다. 이는 커서가 데이터를 스캔하면서 사용되는 기준점이기 때문입니다.

관련하여 더 깊은 이해를 위해, 아래 링크에서 커서 기반 페이징과 관련된 추가 정보를 참조하시기 바랍니다:

위 링크에서는 MySQL의 페이징 기술과 인덱스 최적화 방법에 대한 심층적인 설명을 다루고 있습니다. 강의 내용을 바탕으로 커서 기반의 페이징에 대해 더 깊이 이해하실 수 있으리라 믿습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

신제우님의 프로필 이미지
신제우

작성한 질문수

질문하기