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

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
페이지 매김 목록을 정확하고 빠르게 표시하려면 세 가지 규칙을 따라야 합니다.
- 항상 정렬하세요: ORDER BY 절이 없는 페이지네이션 쿼리는 서버가 호출 간에 행 순서를 자유롭게 변경할 수 있으므로 동일한 레코드를 두 개의 다른 페이지에 표시하고 다른 레코드를 완전히 숨길 수 있습니다.
- 특정 열을 기준으로 정렬: 정렬 열에서 동점일 경우, 동점인 행들의 순서는 정해지지 않습니다. 기본 키를 기준으로 정렬하거나 기본 키를 동점 처리 기준으로 추가하면 이 문제가 해결됩니다.
- 심층 페이지를 살펴보세요: 오프셋 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를 사용하면 됩니다. |
두 경우 모두 동작 방식은 동일합니다. 행 수를 제한하고, 선택적으로 특정 행 수를 건너뛸 수 있습니다. 표기법만 다를 뿐입니다. 따라서 여러 검색 엔진에서 실행해야 하는 쿼리는 행 제한 절을 코드 전체에 분산시키지 않고 별도로 분리해야 합니다.
