답변:
데이터베이스는 먼저 주문한 다음 처음 20 개를 가져옵니다. 데이터베이스는 WHERE
이전 절의 내용도 처리 ORDER BY
합니다.
LIMIT
휴식 ORDER BY
. 와 반환 잘못된 결과. 어떻게 든 반환 결과 집합을 다시 LIMIT
ORDER BY
LIMIT
ORDER BY
LIMIT 절을 사용하여 SELECT 문에 의해 리턴되는 행 수를 제한 할 수 있습니다. LIMIT는 하나 또는 두 개의 숫자 인수를 취하는데, 둘 다 음이 아닌 정수 상수 여야합니다 (준비된 명령문을 사용할 때 제외).
두 개의 인수를 사용하면 첫 번째 인수는 반환 할 첫 번째 행의 오프셋을 지정하고 두 번째 인수는 반환 할 최대 행 수를 지정합니다. 초기 행의 오프셋은 0 (1 아님)입니다.
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
특정 오프셋에서 결과 집합의 끝까지 모든 행을 검색하려면 두 번째 매개 변수에 큰 숫자를 사용할 수 있습니다. 이 명령문은 96 번째 행에서 마지막 행까지의 모든 행을 검색합니다.
SELECT * FROM tbl LIMIT 95,18446744073709551615;
하나의 인수로 값은 결과 집합의 시작 부분에서 반환 할 행 수를 지정합니다.
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
즉, LIMIT row_count는 LIMIT 0, row_count와 같습니다.
http://dev.mysql.com/doc/refman/5.0/en/select.html 에 대한 모든 세부 사항
@James가 말한 것처럼 모든 레코드를 주문한 다음 처음 20 행을 가져옵니다.
따라서 처음 게시 된 20 개의 기사를 얻을 수 있으며 최신 기사는 표시되지 않습니다.
최신 기사를 원하면 최신 기사가 먼저 나오는 경우에 추가 desc
하는 것이 좋습니다 order by publish_date
.
결과를 오름차순으로 유지하고 10 개의 최신 기사 만 원하는 경우 mysql에 결과를 두 번 정렬하도록 요청할 수 있습니다.
아래의이 쿼리는 결과를 내림차순으로 정렬하고 결과를 10 (괄호 안의 쿼리)으로 제한합니다. 여전히 내림차순으로 정렬되며 만족스럽지 않으므로 mysql에 한 번 더 정렬하도록 요청합니다. 이제 마지막 행에서 최신 결과를 얻습니다.
select t.article
from
(select article, publish_date
from table1
order by publish_date desc limit 10) t
order by t.publish_date asc;
모든 열이 필요한 경우 다음과 같이 수행됩니다.
select t.*
from
(select *
from table1
order by publish_date desc limit 10) t
order by t.publish_date asc;
데이터베이스를 검사하기 위해 수동으로 쿼리를 작성할 때이 기술을 사용합니다. 프로덕션 환경에서는 사용하지 않았지만 이제 벤치마킹하면 추가 정렬이 성능에 영향을 미치지 않습니다.
이 경우 publish_date
필드 에 적합한 인덱스가있는 경우 MySQL은 20 개의 레코드를 요청하기 위해 전체 인덱스를 스캔 할 필요가 없습니다. 인덱스의 시작 부분에 20 개의 레코드가 있습니다. 그러나 적합한 인덱스가 없으면 테이블을 전체 스캔해야합니다.
이에 대한 2009 년 의 MySQL 성능 블로그 기사가 있습니다.
이 코드를 사용할 수 있습니다.
SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
여기서 0은 레코드의 시작 한계 및 10 개의 레코드 수입니다.
LIMIT 10
의 줄임말입니다 LIMIT 0,10
.
LIMIT는 일반적으로 마지막 작업으로 적용되므로 결과가 먼저 정렬 된 다음 20으로 제한됩니다. 실제로 처음 20 개의 정렬 된 결과가 발견되면 정렬이 중지됩니다.
publish_date
가 동일하면 순서대로 정렬해도 결과가 명확하지 않으므로LIMIT
페이지 매김에 사용하면 다른 페이지에서 동일한 항목을 얻을 수 있습니다!