MySQL은 쿼리에서 ORDER BY 및 LIMIT를 어떻게 처리합니까?
다음과 같은 쿼리가 있습니다.
SELECT article FROM table1 ORDER BY publish_date LIMIT 20
ORDER BY는 어떻게 작동합니까? 모든 레코드를 주문한 다음 처음 20 개를 받거나 20 개 레코드를 가져 와서 publish_date
필드 별로 주문 합니까?
마지막 기사 인 경우 실제로 최신 기사 20 개를 얻을 수있는 것은 아닙니다.
데이터베이스는 먼저 주문한 다음 처음 20 개를 가져옵니다. 데이터베이스는 WHERE
이전 절의 내용도 처리 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 에 대한 모든 세부 사항
이 경우 publish_date
필드 에 적합한 인덱스가있는 경우 MySQL은 20 개의 레코드를 요청하기 위해 전체 인덱스를 스캔 할 필요가 없습니다. 인덱스의 시작 부분에 20 개의 레코드가 있습니다. 그러나 적합한 인덱스가 없으면 테이블을 전체 스캔해야합니다.
이에 대한 2009 년 의 MySQL 성능 블로그 기사가 있습니다.
가장 이른 또는 최신 레코드를 얻기 위해 주문 끝에 [asc] 또는 [desc]를 추가 할 수 있습니다.
예를 들어, 이렇게하면 먼저 최신 레코드가 제공됩니다
ORDER BY stamp DESC
다음에 LIMIT
절을 추가하십시오ORDER BY
@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;
데이터베이스를 검사하기 위해 수동으로 쿼리를 작성할 때이 기술을 사용합니다. 프로덕션 환경에서는 사용하지 않았지만 이제 벤치마킹하면 추가 정렬이 성능에 영향을 미치지 않습니다.
이 코드를 사용할 수 있습니다. SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
여기서 0은 레코드의 시작 한계 및 10 개의 레코드 수입니다.
LIMIT는 일반적으로 마지막 작업으로 적용되므로 결과가 먼저 정렬 된 다음 20으로 제한됩니다. 실제로 처음 20 개의 정렬 된 결과가 발견되면 정렬이 중지됩니다.
또한 LIMIT 구문은 데이터베이스에 따라 다릅니다 (예 :
mysql
-제한 1, 2
postgres
-한계 2 오프셋 1
참고 URL : https://stackoverflow.com/questions/4708708/how-does-mysql-process-order-by-and-limit-in-a-query
'Programing' 카테고리의 다른 글
C ++에 헤더 파일을 포함하는 동안 꺾쇠 괄호 <>와 큰 따옴표 ""의 차이점은 무엇입니까? (0) | 2020.04.17 |
---|---|
url ()의 값을 인용하는 것이 정말로 필요한가? (0) | 2020.04.17 |
렌더링되지 않은보기를 iOS 8 스냅 샷하면 빈 스냅 샷이 생성됩니다. (0) | 2020.04.17 |
git difftool, 직렬이 아닌 모든 diff 파일을 즉시여십시오. (0) | 2020.04.17 |
Visual Studio 2012 웹 게시에서 파일을 복사하지 않습니다 (0) | 2020.04.17 |