해결된 질문
작성
·
64
0
현재 페이지네이션 기반 조회 시 조회 과정이 궁금해서 질문드립니다.
secondary index에서 offset 위치까지 순차탐색 -> secondary index -> 클러스터링 인덱스에서 primary key 조회 -> 실제 데이터 조회
일단 위 과정이 맞는지 궁금합니다.
2 . 위 과정이 맞다면 이 과정에서 db에서 데이터 조회를 limit만큼 반복하는 것인지, 아니면 실제 db에서 데이터 조회는 한 번에 이루어지는 것인지 궁금합니다.
페이지 조회 말고 그냥 범위 조회일 시에는 한 번에 조회되서 값이 많아도 시간 차이가 많이 안나는지 궁금합니다. offset 없이 조회해보니 바로 조회되는 거 같긴합니다.
답변 2
1
yso829612님, 안녕하세요!
secondary index에서 offset 위치까지 순차탐색 -> secondary index -> 클러스터링 인덱스에서 primary key 조회 -> 실제 데이터 조회
커버링 인덱스 활용한 최적화 쿼리에 대해서 말씀하시는 것이겠죠?
살짝 정정해보면, 클러스터링 인덱스는 데이터를 포함하고 있습니다.
"클러스터링 인덱스에서 primary key 조회 -> 실제 데이터 조회" 이거를 하나로 통합해서 생각하시면 될 것 같네요.
세컨더리 인덱스가 클러스터링 인덱스에 접근하기 위한 primary key를 가지고 있는 것이고,
클러스터링 인덱스는 데이터를 가지고 있습니다.
즉, secondary index에서 offset 만큼 순차적으로 scan 하는 것은 맞고(where 조건은 인덱스 트리에서 로그 시간에 탐색하고, 그 지점부터 순차 탐색이란 의미입니다.),
해당 지점에서부터 limit 만큼 primary key(클러스터링 인덱스에 접근하기 위한 포인터)를 찾아서,
클러스터링 인덱스에서 데이터를 조회하는 것입니다.
클러스터링 인덱스를 탐색하는 것이 실제 데이터를 조회하는 과정입니다.
2 . 위 과정이 맞다면 이 과정에서 db에서 데이터 조회를 limit만큼 반복하는 것인지, 아니면 실제 db에서 데이터 조회는 한 번에 이루어지는 것인지 궁금합니다.
limit 만큼 반복한다는 것을 이해를 못하였는데 어떤 의미일까요?
offset만큼 scan이 끝났으면, limit 만큼 한 번에 데이터를 조회하면 됩니다.("한 번에"라는 말의 정확한 의미 파악은 못하였지만, limit이 크면 물리적으로 디스크 I/O가 반복적으로 수행될 수는 있을 것 같네요. 이 이상의 영역은 블랙박스로 생각해도 좋을 것 같습니다.)
페이지 조회 말고 그냥 범위 조회일 시에는 한 번에 조회되서 값이 많아도 시간 차이가 많이 안나는지 궁금합니다. offset 없이 조회해보니 바로 조회되는 거 같긴합니다.
범위 조회라는게 어떤 의미일까요? 인덱스는 트리 구조로 이루어져있다는 점을 기반으로 인지하면, 충분히 동작을 유추해보실 수 있을 것 같습니다.
where 조건이 인덱스를 태울 수 있으면, 기준점은 로그 시간에 찾을 수 있으므로 당연히 빠르게 조회가 됩니다.
offset은 기준점부터 순차적으로 scan하는 과정이 필요하기 때문에 커질수록 느려지게 됩니다!
0
안녕하세요, 인프런 AI 인턴입니다. yso829612님.
페이지네이션을 구현하면서 데이터베이스 인덱스 사용에 대한 질문을 주셨네요. 여러 과정의 실행 방식과 그 효율성에 대한 이해를 돕고자 관련 내용을 설명드리겠습니다.
페이지네이션 과정에서 데이터베이스가 어떻게 데이터를 찾는지에 대한 설명입니다.
offset
위치까지 순차 탐색합니다.일반적으로 이러한 과정을 통해 데이터가 찾아집니다.
데이터베이스가 데이터를 처리하는 방식은 offset
과 limit
값에 따라 결정됩니다.
limit
만큼 데이터를 로드합니다. 하지만, 이 과정에서 offset이 크다면 많은 데이터를 건너뛰어야 하므로 성능 저하가 발생할 수 있습니다.범위 조회는 주로 인덱스가 잘 설정된 경우 더 효율적으로 작동합니다. 데이터베이스는 범위를 지정하여 필요한 데이터만 한 번에 가져올 수 있으므로, 페이지네이션에 생산적인 성능 개선을 보입니다. 이는 offset
없이 쿼리하는 것이 더 효율적인 이유입니다.
관련해서 다른 사용자들이 유사한 질문을 하셨던 사례들이 있어 도움이 될 것 같습니다. 특히 페이징 쿼리와 인덱스 사용에 대해 깊게 다룬 사례들입니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.