[mysql] 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 에 대한 모든 세부 사항


답변

@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 성능 블로그 기사가 있습니다.


답변

가장 이른 또는 최신 레코드를 얻기 위해 주문 끝에 [asc] 또는 [desc]를 추가 할 수 있습니다.

예를 들어, 이렇게하면 먼저 최신 레코드가 제공됩니다

ORDER BY stamp DESC

다음에 LIMIT절을 추가하십시오ORDER BY


답변

이 코드를 사용할 수 있습니다.
SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
여기서 0은 레코드의 시작 한계 및 10 개의 레코드 수입니다.


답변

LIMIT는 일반적으로 마지막 작업으로 적용되므로 결과가 먼저 정렬 된 다음 20으로 제한됩니다. 실제로 처음 20 개의 정렬 된 결과가 발견되면 정렬이 중지됩니다.