itsource

쿼리에서 MySQL은 ORDER BY 및 LIMIT을 어떻게 처리합니까?

mycopycode 2022. 9. 19. 23:42
반응형

쿼리에서 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;

인수 1개를 사용하여 결과 세트의 선두에서 반환되는 행의 수를 지정합니다.

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;

이 기술을 사용하여 수동으로 쿼리를 작성하여 데이터베이스를 검사합니다.실가동 환경에서 사용한 적은 없습니다만, 벤치에 표시하면, 여분의 정렬은 퍼포먼스에 영향을 주지 않습니다.

주문 마지막에 [asc]또는 [desc]를 추가하여 최신 또는 최신 레코드를 취득할 수 있습니다.

예를 들어, 가장 먼저 최신 레코드를 제공합니다.

ORDER BY stamp DESC

append append append다를 .LIMIT에 절ORDER BY

인덱스가 , 이 에서는, 「」, 「」에 ,publish_date필드를 선택하면 MySQL이 요청된 20개의 레코드를 얻기 위해 전체 인덱스를 스캔할 필요가 없습니다. 20개의 레코드는 인덱스의 시작 부분에서 발견됩니다.그러나 적절한 인덱스가 없는 경우 표의 전체 스캔이 필요합니다.

이에 대한 2009© MySQL 퍼포먼스 블로그 기사가 있습니다.

할 수 .SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10레코드의 수 "0"은 "10"의 제한입니다.

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

다음과 같이 단순화할 수 있습니다.

SELECT article FROM table1 ORDER BY publish_date DESC FETCH FIRST 20 ROWS ONLY;

, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 하다, 이렇게 도 있어요.ORDER BY하다, 쉼표로 구분하다.ORDER BY publish_date, tab2, tab3 DESCsyslog...

언급URL : https://stackoverflow.com/questions/4708708/how-does-mysql-process-order-by-and-limit-in-a-query

반응형