본문 바로가기
Everyday Study

2024.09.24(화) { 오프셋 기반 페이징의 문제점 }

by xogns93 2024. 9. 24.

오프셋 기반 페이징의 문제점

오프셋 기반 페이징은 주로 다음과 같은 방식으로 이루어집니다:

SELECT * FROM table_name
ORDER BY column_name
LIMIT 20 OFFSET 100;

이 방식은 조회할 데이터의 시작점을 OFFSET으로 지정하고, 한 페이지에 가져올 데이터 개수를 LIMIT으로 설정합니다. 하지만 오프셋 기반 페이징은 데이터 양이 많아질수록 비효율적입니다. 그 이유는 다음과 같습니다:

  1. 많은 양의 데이터 스캔:
    • 오프셋 값이 클수록 데이터베이스는 불필요하게 많은 데이터를 읽어야 합니다. 예를 들어, OFFSET 1000인 경우, 데이터베이스는 처음 1000개의 데이터를 건너뛰기 위해 그만큼의 데이터를 읽고 버린 후에, 필요한 20개의 데이터를 가져옵니다. 이는 쿼리 성능에 부담을 줍니다.
  2. 인덱스 비효율성:
    • 오프셋이 클수록 인덱스를 사용하더라도 성능이 저하됩니다. 왜냐하면 데이터베이스는 OFFSET 값에 따라 해당 데이터에 도달하기까지 계속해서 읽어야 하기 때문입니다. 특히 데이터가 많은 테이블에서 이 문제는 더욱 두드러집니다.
  3. 데이터의 변동:
    • 페이징된 데이터를 사용자가 조회하는 동안 데이터베이스에서 데이터가 추가되거나 삭제되면, 페이지 간의 데이터가 중복되거나 빠질 수 있는 문제가 발생합니다.

커서 기반 페이징(키 기반 페이징)의 장점

커서 기반 페이징은 오프셋 기반 페이징의 성능 문제를 해결하는 방식으로, 특정 키(커서)를 기준으로 다음 데이터를 조회하는 방식입니다. 이를 통해 불필요한 데이터 스캔을 방지하고 성능을 개선할 수 있습니다.

커서 기반 페이징의 동작 방식

커서 기반 페이징은 이전 페이지의 마지막 데이터의 키를 기준으로 다음 데이터를 조회하는 방식입니다. 예를 들어, ID 값이 100인 데이터까지 조회한 다음, 그 이후의 데이터를 가져오는 방식입니다.

SELECT * FROM table_name
WHERE id > 100
ORDER BY id ASC
LIMIT 20;

이 방식의 장점은 다음과 같습니다:

  1. 효율적인 인덱스 사용:
    • 커서 기반 페이징은 오프셋을 사용하지 않고, 특정 키(예: id)를 기준으로 데이터를 조회하므로 인덱스를 효율적으로 사용할 수 있습니다. 이는 대량의 데이터에서도 성능이 일정하게 유지됩니다.
  2. 불필요한 데이터 스캔 감소:
    • 오프셋 방식과 달리 불필요한 데이터를 건너뛰지 않기 때문에 쿼리 성능이 매우 효율적입니다. 예를 들어, id > 100 조건을 사용하면 바로 100 이후의 데이터부터 가져오기 때문에 불필요한 스캔이 줄어듭니다.
  3. 안정적인 데이터 조회:
    • 데이터의 변동이 있더라도 커서 기반 페이징은 중복이나 누락 문제를 방지할 수 있습니다. 오프셋 방식에서는 데이터가 삽입되거나 삭제될 때 페이지 간의 데이터가 중복되거나 빠질 가능성이 있지만, 커서 기반 페이징에서는 이런 문제가 줄어듭니다.

예시

오프셋 기반 페이징:

SELECT * FROM members
ORDER BY id
LIMIT 20 OFFSET 100;
  • 데이터가 많아지면 OFFSET 값에 따라 많은 데이터를 읽고 버린 후 결과를 반환하므로 비효율적입니다.

커서 기반 페이징:

SELECT * FROM members
WHERE id > 100
ORDER BY id
LIMIT 20;
  • 이전 페이지에서 마지막으로 조회된 id를 기준으로 그 이후 데이터를 효율적으로 조회합니다. 데이터베이스는 바로 id > 100부터 조회하므로 성능이 더 좋습니다.

결론

  • 오프셋 기반 페이징은 대량의 데이터를 처리할 때 성능 문제가 발생할 수 있으며, 인덱스 비효율성불필요한 데이터 스캔 등의 단점이 있습니다.
  • 커서 기반 페이징(키 기반 페이징)은 오프셋 대신 특정 키를 기준으로 데이터를 조회하는 방식으로, 성능이 매우 뛰어나고 대규모 데이터에서도 안정적으로 동작합니다.