inflearn logo
강의

Course

Instructor

MySQL learned from a Toss developer who processes over 500 billion pieces of financial data

Advanced SELECT Techniques for Complex Service Data

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

Resolved

54

jewoo

9 asked

0

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

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

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

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

mysql-query cursor-based-paging

Answer 2

1

Hong

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

 

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

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

 

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

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

 

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

 

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

 

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

 

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

 

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

0

communityai8509

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

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

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

  1. 순차성과 일관성:

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

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

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

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

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

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

칼럼명

0

53

2

프로시저

0

53

2

13강에서 말씀하신 엄청난 쿼리가 어떤 쿼리일까요?

0

64

1

Commit 응답받기 전 네트워크 문제가 발생하면

1

65

1

도커로 mysql latest(9.5) 이미지 사용시 explain 결과가 다른 부분 해결책

0

75

2

커서기반의 페이징 부분 질문 있습니다.

0

80

2

14분44초에 쿼리 질문드립니다.

0

73

2

HikariCP maxLifetime 가 db 부하에 주는 영향

0

90

2

9강 인덱스 설계 관련 문의

1

98

3

인덱스 및 DB 질문

0

94

2

첫번째 프로시저 명령에서 Account가 생성되지 않습니다

0

88

1

ep12. (2) LEFT JOIN 사용 방법 준수 - 오타 질문

0

75

2

ep.12 count(*) 질문

0

67

2

실례합니다만.. 혹시 강의 할인

0

243

1

2번째 더미데이터 생성이 되지 않습니다.

1

117

2

레코드 수정시 저장공간이 부족하면

0

81

2

복합 index 문의

0

87

2

강의

0

83

1

Order BY 강의 12분 질문

0

78

2

LEFT JOIN 시 드라이빙 테이블을 왜 ALL로 읽나요?

0

108

2

GAP 락에 대한 질문 드립니닷..!

0

195

1

ORDER BY가 필요한 이유

0

177

2

[오타 제보] 선행 데이터를 기반으로 한 데이터 분석

0

167

1

2강. VARCHAR(255) 저장되는 데이터의 길이 정보 질문

0

449

2