2010-05-12 3 views
2

쿼리에 LIMIT 1을 추가하면 처리 속도가 빨라지는지 궁금합니다. 예를 들어MYSQL 및 LIMIT 절

...

나는 시간이 반환 한 결과의 대부분은, 그러나 occasionaly 10 년대, 100 나 기록도 1000 년대를 반환하는 쿼리가 있습니다. 그러나 나는 오직 첫 번째 기록 만 원할 것이다.

제한을 1로 설정하면 속도가 향상 되나요?

GROUP BY를 사용하여 결과를 1 개 반환 할 수는 있지만 더 많은 계산이 추가된다는 것을 알고 있습니다.

어떤 생각이라도 기꺼이 받아 들여집니다!

감사합니다.

답변

4

을 볼 수 있습니다. ORDER BY는 어쨌든 전체 결과 세트를 필요로하므로 주문할 수 있습니다.

ORDER BY가 없으면 더 빨리 실행해야합니다.

전체 결과 집합이 물론 전송 될 필요가 없기 때문에 모든 경우에 적어도 조금 더 빠르게 실행됩니다.

+0

실제로 ORDER BY를 사용하더라도 효과가있는 것으로 보입니다. 이것이 정렬 방법의 제품인지, 첫 번째 _row_count_ 행이 정렬되면 정렬을 중지 할 수 있는지 확실하지 않습니다. 내 대답의 링크를 참조하십시오. – Phil

2

예! 그럴거야!

은 그러나 확실하게, 그것은 단지 왜 주사를하지 SQL 문의 끝에 '제한 1'을 추가 할 초를 가지고 당신이 BY 주문이있는 경우 상황에 따라 다르다

0

Here is some relevant documentation MySQL 사이트에서.

쿼리의 다른 부분에 따라 다른 방식으로 처리 속도를 높일 수 있습니다. ORDER 또는 GROUP 또는 HAVING 절이 없을 때 도움이되는지 확신 할 수 없습니다. 단 하나의 결과 행을 모두 돌려주는 것이 아니라 즉시 중지 할 수 있습니다 (10 만 레코드를 되 찾는다면 속도가 충분히 빨라질 수 있습니다.)).

2

모두 쿼리 자체에 따라 다릅니다. 인덱스 된 룩업 (where indexedColumn = somevalue) 또는 인덱싱 된 컬럼의 정렬 (Where 절 없음)을 수행하면 한계 1로 인해 실제로 속도가 향상됩니다. 조인이 있거나 여러 order/order 절이 있으면 상황이 실제로 복잡해진다. 하지만 "LIMIT 1"을 사용하는 것이 중요합니다. NEVER 쿼리의 속도가 느려집니다. 때로는 속도가 빨라지지만 결코 느려지지 않습니다.

이제 PHP를 다룰 때 또 다른 문제가 있습니다. 기본적으로 PHP는 쿼리에서 반환하기 전에 전체 결과 집합을 버퍼링합니다 (mysql_query 또는 mysqli-> 쿼리는 모든 레코드가 다운로드 된 후에 만 ​​반환됩니다). 따라서 쿼리 시간이 제한 1로 조금 변경 될 수 있지만 PHP가 결과를 버퍼링하는 데 사용하는 시간과 메모리는 중요합니다. 각 행에 200 바이트의 데이터가 있다고 가정 해보십시오. 이제 쿼리에서 10,000 개의 행을 반환합니다. 즉, PHP는 2MB의 메모리를 추가로 할당해야합니다. 실제로는 사용하지 않을 PHP 구조체의 오버 헤드로 10MB에 가깝습니다. 메모리를 할당하는 것은 매우 비쌀 수 있으므로, 일반적인 규칙은 필요한 것만 할당합니다 (또는 필요할 것으로 생각 함). 1 만 원할 때 10,000 행을 다운로드하면 낭비입니다.

이 두 가지 효과를 결합하면 1 행만 원할 경우 왜 "LIMIT 1"을 사용해야하는지 알 수 있습니다.

0

이것은 실제로 LIMIT 절의 근본적인 목적입니다. P 원하는 결과가 얼마나 많은지 알면 그 숫자를 항상 LIMIT로 지정해야합니다 (ORDER BY를 수행하지 않는 한) 그러나 PHP 스크립트의 메모리로보다 효율적으로 작업 할 수 있습니다.

참고 : PHP에 MySQL을 사용하고 있다고 가정합니다. PHP에 태그를 추가했기 때문에 사용하고 있습니다. ORDER BY를 사용할 때 LIMIT를 사용하는 것이 MySQL을 직접 (스크립트 언어를 사용하지 않고) 선택하는 경우에만 결과를 관리하기가 더 쉬워집니다.