MySQL LIMIT 및 OFFSET 예시

⚡ 스마트 요약

The MySQL LIMIT 키워드는 쿼리가 반환할 행 수를 제한하고, OFFSET 값은 결과가 시작되는 행을 결정합니다. 이 둘을 함께 사용하면 결과 집합의 크기를 줄이고, 페이지 로딩 속도를 높이며, 레코드별 페이지네이션을 구현할 수 있습니다.

  • 🔢 핵심 행동: LIMIT N은 최대 N개의 행을 반환합니다. N개보다 적은 행을 가진 테이블은 오류 없이 모든 행을 반환합니다.
  • 0️⃣ 제로 케이스: LIMIT 0은 행을 반환하지 않으므로 열 메타데이터를 검사하는 저렴한 방법입니다.
  • 📍 오프셋 구문: LIMIT 1, 2는 한 행을 건너뛰고 두 행을 반환하므로 오프셋이 먼저 기록되고 행 수가 두 번째로 기록됩니다.
  • 📄 페이지네이션 공식: OFFSET은 페이지 크기에 페이지 번호를 곱한 값에서 1을 뺀 값과 같으며, 이를 통해 결과 집합이 페이지 번호로 된 형식으로 변환됩니다.
  • ↕️ 순서 의존성: 순서 없이 MySQL LIMIT 함수는 실행할 때마다 다른 행을 반환할 수 있으므로 명시적인 정렬이 있을 때만 결과가 확정적입니다.
  • ⚙️ 성명서 지원: LIMIT는 UPDATE 및 DELETE 작업으로 영향을 받는 행 수를 제한하여 대규모 테이블이 무제한으로 쓰기 작업을 수행하는 것을 방지합니다.
  • 🐢 성능 관련 주의사항: 큰 오프셋은 MySQL 건너뛴 행을 모두 읽고 버리므로 페이지가 깊어지는 속도가 느려집니다.

MySQL 제한 및 오프셋

LIMIT 키워드는 무엇인가요? MySQL?

The 제한 `DELETE` 키워드는 쿼리 결과에서 반환되는 행 수를 제한합니다. 이 키워드는 SELECT, UPDATE, DELETE 문과 함께 사용할 수 있으므로 쿼리가 읽는 행 수와 쓰기 작업의 영향을 받는 행 수를 모두 제한합니다.

LIMIT 키워드의 구문은 다음과 같습니다.

SELECT {fieldname(s) | *} FROM tableName(s) [WHERE condition] LIMIT N;

여기를 클릭하십시오.

  • “SELECT {필드 이름 | *} 테이블 이름에서” 이다 SELECT 문 쿼리에서 반환하려는 필드가 포함되어 있습니다.
  • “[WHERE 조건]” 선택 사항이지만, 제공될 경우 결과 집합에 대한 필터를 지정합니다. WHERE 절 LIMIT 전에 적용되므로 필터링이 먼저 발생하고 남은 값에 제한이 적용됩니다.
  • “제한 N” 이것이 핵심 키워드입니다. N N은 0부터 시작하는 임의의 숫자입니다. 제한값을 0으로 설정하면 레코드가 전혀 반환되지 않습니다. 5와 같은 숫자를 설정하면 5개의 레코드가 반환됩니다. 테이블에 N보다 적은 레코드가 있는 경우 모든 레코드가 반환되며 오류가 발생하지 않습니다.

구문은 간결하지만, 예시를 살펴보기 전에 그 존재 이유를 설명하는 것이 좋습니다.

왜 LIMIT 키워드를 사용해야 할까요?

우리가 개발 중이라고 가정해 봅시다.ping myflixdb를 기반으로 실행되는 애플리케이션입니다. 시스템 설계자들은 로딩 속도 저하를 방지하기 위해 페이지당 표시되는 레코드 수를 20개로 제한해달라고 요청했습니다. 이러한 요구 사항을 충족하는 시스템을 어떻게 구현해야 할까요?

LIMIT 키워드는 바로 이러한 상황을 처리합니다. 모든 멤버 행을 애플리케이션으로 가져와 대부분을 버리는 대신, 쿼리는 페이지당 20개의 레코드를 반환하고 데이터베이스가 나머지 작업을 처리합니다. 이로 인해 세 가지 이점이 있습니다.

  • 더 빠른 응답: 디스크에서 읽는 데이터 양이 줄어들고 네트워크를 통해 전송되는 데이터 양도 줄어듭니다.
  • 메모리 사용량 감소: 해당 애플리케이션은 테이블 전체가 아니라 한 페이지의 행만 저장합니다.
  • 세이퍼는 다음과 같이 썼습니다. 업데이트 또는 제한 삭제 문장은 오류가 발생할 수 있는 행의 수를 제한합니다.

MySQL LIMIT 쿼리 예시

아래 예제는 myflixdb 데이터베이스의 members 테이블을 대상으로 실행됩니다. 첫 번째 예제는 두 개의 행만 반환하고 그 외에는 아무것도 반환하지 않습니다.

SELECT * FROM members LIMIT 2;
회원_번호 전체 이름 성별 생일 등록일 물리적_주소 우편 주소 연락처 이메일 신용카드 번호
1 자넷 존스 여성 21-07-1980 NULL 첫 번째 거리 플롯 번호 4 전용 가방 + 0759 253 542 janetjones@yagoo.cm NULL
2 자넷 스미스 존스 여성 23-06-1980 NULL 멜로즈 123 NULL NULL jj@fstreet.com NULL

위 결과에서 볼 수 있듯이, 단 두 명의 회원만 반환되었습니다.

데이터베이스에서 10명의 멤버 목록을 가져옵니다.

Myflix 데이터베이스에서 처음 등록된 회원 10명의 목록을 얻고 싶다고 가정해 보겠습니다. 아래 스크립트는 해당 목록을 요청합니다.

SELECT * FROM members LIMIT 10;

스크립트를 실행하면 아래와 같은 결과가 나타납니다.

회원_번호 전체 이름 성별 생일 등록일 물리적_주소 우편 주소 연락처 이메일 신용카드 번호
1 자넷 존스 여성 21-07-1980 NULL 첫 번째 거리 플롯 번호 4 전용 가방 + 0759 253 542 janetjones@yagoo.cm NULL
2 자넷 스미스 존스 여성 23-06-1980 NULL 멜로즈 123 NULL NULL jj@fstreet.com NULL
3 로버트 필 남성 12-07-1989 NULL 3번가 34 NULL 12345 rm@tstreet.com NULL
4 글로리아 윌리엄스 여성 14-02-1984 NULL 2번가 23 NULL NULL NULL NULL
5 레너드 호프스타터 남성 NULL NULL 우드크레스트 NULL 845738767 NULL NULL
6 셀던 쿠퍼 남성 NULL NULL 우드크레스트 NULL 976736763 NULL NULL
7 라제시 쿠트라팔리 남성 NULL NULL 우드크레스트 NULL 938867763 NULL NULL
8 레슬리 윙클 남성 14-02-1984 NULL 우드크레스트 NULL 987636553 NULL NULL
9 하워드 왈로위츠 남성 24-08-1981 NULL 남쪽 공원 P.O. Box 4563 987786553 lwolowitz[at]email.me NULL

LIMIT 절의 N이 테이블의 레코드 수보다 크기 때문에 9개의 멤버만 반환되었습니다. 명시적으로 9개 행을 요청해도 동일한 결과가 반환됩니다.

SELECT * FROM members LIMIT 9;

💡 팁: LIMIT는 서버에서 생성하는 순서와 관계없이 행을 선택합니다. 추가 주문 행의 정체성이 중요한 경우에는 해당 조항을 사용해야 합니다. 그렇지 않으면 "처음 10명"이라는 표현이 동일한 9명을 두 번 의미하는 것은 아닙니다.

행 개수를 제한하는 것이 이 기능의 첫 번째 단계이고, 윈도우 시작 위치를 선택하는 것이 두 번째 단계입니다.

LIMIT 쿼리에서 OFFSET 값 사용

The OFFSET value는 LIMIT 키워드와 함께 가장 자주 사용됩니다. 서버가 데이터를 가져오기 시작할 행을 지정하므로 해당 행 이전의 행은 건너뛰게 됩니다.

테이블의 중간 행부터 시작하여 제한된 수의 멤버만 가져오고 싶다고 가정해 보겠습니다. 아래 스크립트는 두 번째 행부터 시작하여 결과를 두 개의 레코드로 제한합니다.

SELECT * FROM `members` LIMIT 1, 2;

실행하기 MySQL 워크 벤치 myflixdb에 대한 검색 결과는 다음과 같습니다.

회원_번호 전체 이름 성별 생일 등록일 물리적_주소 우편 주소 연락처 이메일 신용카드 번호
2 자넷 스미스 존스 여성 23-06-1980 NULL 멜로즈 123 NULL NULL jj@fstreet.com NULL
3 로버트 필 남성 12-07-1989 NULL 3번가 34 NULL 12345 rm@tstreet.com NULL

여기를 참고하세요 오프셋 = 1따라서 2번째 행이 반환되는 첫 번째 행입니다. 제한값 = 2따라서 단 2개의 레코드만 반환됩니다.

두 개의 인수를 사용하는 형식에서는 오프셋이 먼저, 행 수가 두 번째로 기록되는데, 이는 실수로 순서를 바꾸기 쉽습니다. MySQL 또한 모호함을 없애는 명시적인 형식도 허용하며, 새 코드에서는 이 형식을 선호하는 것이 좋습니다.

SELECT * FROM `members` LIMIT 2 OFFSET 1;

두 명령 모두 동일한 두 행을 반환합니다. 오프셋을 이해하면 모든 목록 화면이 의존하는 페이지네이션 패턴이 바로 도출됩니다.

LIMIT 및 OFFSET을 사용하여 쿼리 결과를 페이지네이션하는 방법

페이지네이션은 대규모 결과 집합을 번호가 매겨진 페이지로 나누는 기능이며, LIMIT와 OFFSET이 이를 구현하는 메커니즘입니다. 모든 페이지 요청은 두 가지 값에 의해 결정됩니다. 하나는 한 화면에 표시되는 레코드 수를 나타내는 페이지 크기이고, 다른 하나는 사용자가 요청한 페이지 번호입니다.

오프셋은 단일 공식을 사용하여 이들로부터 도출됩니다.

-- OFFSET = page_size * (page_number - 1)
SELECT membership_number, full_names
FROM members
ORDER BY membership_number ASC
LIMIT 20 OFFSET 0;   -- page 1

2페이지는 동일한 제한을 유지하고 오프셋을 페이지 크기만큼 앞으로 이동합니다.

SELECT membership_number, full_names
FROM members
ORDER BY membership_number ASC
LIMIT 20 OFFSET 20;  -- page 2

페이지 매김 목록을 정확하고 빠르게 표시하려면 세 가지 규칙을 따라야 합니다.

  1. 항상 정렬하세요: ORDER BY 절이 없는 페이지네이션 쿼리는 서버가 호출 간에 행 순서를 자유롭게 변경할 수 있으므로 동일한 레코드를 두 개의 다른 페이지에 표시하고 다른 레코드를 완전히 숨길 수 있습니다.
  2. 특정 열을 기준으로 정렬: 정렬 열에서 동점일 경우, 동점인 행들의 순서는 정해지지 않습니다. 기본 키를 기준으로 정렬하거나 기본 키를 동점 처리 기준으로 추가하면 이 문제가 해결됩니다.
  3. 심층 페이지를 살펴보세요: 오프셋 100000 힘 MySQL 십만 개의 행을 읽고 다음 스무 개의 행을 반환하기 전에 모두 버리는 것과 같습니다. 응답 시간은 페이지 수가 늘어날수록 증가합니다.

매우 깊은 페이지네이션의 경우, 키셋 페이지네이션은 오프셋을 완전히 사용하지 않습니다. 건너뛸 행 수를 세는 대신, 쿼리는 이전 페이지의 마지막 키를 기억하고 그 이후의 행들을 요청합니다.

SELECT membership_number, full_names
FROM members
WHERE membership_number > 20      -- last id from the previous page
ORDER BY membership_number ASC
LIMIT 20;

이 형식은 인덱스가 바로 앞 행들을 순회하는 대신 시작 키로 바로 이동하기 때문에 어떤 깊이에서도 빠른 속도를 유지합니다. 다만, 페이지를 순서대로 탐색해야 하므로 점프 속도가 느려진다는 단점이 있습니다.ping 500페이지로 바로 이동하는 것은 더 이상 불가능합니다.

제한 MySQL vs TOP 및 1위 획득

LIMIT 절은 모든 SQL 방언에 포함되어 있는 것은 아니며, 이는 쿼리가 여러 데이터베이스 엔진 간에 이동해야 할 때 중요한 문제입니다. MySQL, PostgreSQL예산 및 SQLite LIMIT 키워드를 공유합니다. SQL Server는 TOP을 사용합니다. Oracle 표준 FETCH FIRST 절을 사용합니다. 아래 표는 세 ​​가지를 비교합니다.

엔진 예시 행을 건너뜁니다
제한 … 오프셋 MySQL, PostgreSQL, SQLite 멤버 목록에서 *를 선택하고 20개 항목을 40개 오프셋으로 정렬합니다. 네, 오프셋을 사용하면 가능합니다.
SQL 서버 회원 중에서 상위 20명을 선택하세요. 아니요, OFFSET … FETCH가 필요합니다.
먼저 가져오기 OracleDb2, 표준 SQL 멤버 목록에서 첫 20개 행만 선택합니다. 네, OFFSET … ROWS를 사용하면 됩니다.

두 경우 모두 동작 방식은 동일합니다. 행 수를 제한하고, 선택적으로 특정 행 수를 건너뛸 수 있습니다. 표기법만 다를 뿐입니다. 따라서 여러 검색 엔진에서 실행해야 하는 쿼리는 행 제한 절을 코드 전체에 분산시키지 않고 별도로 분리해야 합니다.

자주 묻는 질문

예. 둘 다 다음과 같은 일반 행 개수를 허용합니다. 삭제 멤버 제한은 10입니다. 두 개의 인수를 사용하는 오프셋 형식은 허용되지 않으므로 영향을 받는 행 수만 제한할 수 있습니다.

오프셋은 0부터 시작하므로, OFFSET 0은 첫 번째 행에서 시작하고 OFFSET 1은 두 번째 행에서 시작합니다. 행 번호 자체는 일반적인 숫자로 읽힙니다.

WHERE 절은 동일하지만 LIMIT 절이 없는 SELECT COUNT(*) 쿼리를 별도로 실행합니다. COUNT는 애플리케이션에 전체 페이지 수를 알려주는 반면, LIMIT 절이 없는 쿼리는 현재 페이지의 행 수를 반환합니다.

네, 대개 그렇습니다. 클라이언트 내부에 있는 AI 비서들은 다음과 같은 기능을 제공합니다. MySQL 워크 벤치 OFFSET 쿼리를 마지막으로 확인된 키를 기준으로 하는 WHERE 절로 다시 작성하세요. 다시 작성하기 전에 정렬 열이 고유하고 인덱싱되어 있는지 확인하세요.

생성된 문장에는 일반적으로 ORDER BY 절이 생략되기 때문입니다. 명시적인 정렬이 없으면, MySQL LIMIT 절은 행을 어떤 순서로든 반환할 수 있으므로, 동일한 LIMIT 절을 사용하더라도 실행할 때마다 다른 샘플이 생성될 수 있습니다. 정렬은 직접 추가해야 합니다.

이 게시물을 요약하면 다음과 같습니다.