MySQL 쿼리에 'LIMIT 1'을 추가하면 결과가 1 개뿐이라는 것을 알고있을 때 쿼리가 더 빨라 집니까?


답변:


81

쿼리에 따라 제한 절을 추가하면 성능에 큰 영향을 미칠 수 있습니다. 하나의 행만 원하고 (또는 하나의 행만 쿼리를 충족 할 수 있다는 사실을 알고 있음) 내부 최적화 프로그램이이를 실행하는 방법에 대해 확신하지 못하는 경우 (예 : WHERE 절이 인덱스에 부딪히지 않는 등) 확실히 LIMIT 절을 추가해야합니다.

최적화 된 쿼리 (작은 테이블의 인덱스 사용)의 경우 성능면에서는 그다지 중요하지 않지만 LIMIT 절을 추가하는 것보다 한 행에만 관심이있는 경우에도 마찬가지입니다.


30
안티 버깅 목적으로 LIMIT 2 전송을 고려한 다음 단일 행 가정이 유지되지 않으면 불평하거나 폭파하는 것이 좋습니다.
Jeffrey Hantin

6
@JeffreyHantin 정말 하나만있을 수 있다면 데이터베이스에 고유 한 제약 조건을 추가하는 것이 좋습니다. 훨씬 깔끔한 다음 온 전성 검사로 코드를 엉망으로 만듭니다.
Cristian Vrabie 2013

@CristianVrabie 고유 한 제약 조건으로 표현할 수 있다면 당연히 테이블의 데이터에 대한 주장입니다. LIMIT 2를 보내고 1을 확인하는 것은 쿼리 자체에 대한 어설 션이며 부적절하게 지정된 조인 조건과 같은 버그를 포함 할 수 있습니다.
Jeffrey Hantin 2013 년

1
@JeffreyHantin 충분하지만 Mars Rover를 위해 코딩하는 경우를 제외하고는 코드를 오염시키기보다는 이에 대한 테스트를 작성합니다.
Cristian Vrabie 2013-08-01

8
@JeffreyHantin 하나만 있다는 가정이 맞다면 LIMIT 2를 추가하면 모든 행을 검색하기 때문에 최적화가 종료되지 않습니까? 이 경우 LIMIT 2를 추가하는 것은 아무것도 추가하지 않는 것보다 낫지 않습니다 (최적화 측면에서).
Chris Middleton

19

제한은 쿼리의 성능에 영향을 미칠 수 있으며 (아래 주석 및 링크 참조) MySQL에서 출력하는 결과 집합도 감소합니다. 단일 결과를 기대하는 쿼리의 경우 이점이 있습니다.

또한 결과 집합을 제한하면 실제로 큰 결과 집합을 전송하면 메모리를 사용하고 잠재적으로 디스크에 임시 테이블을 만들 수 있으므로 총 쿼리 시간을 단축 할 수 있습니다. 최근에 한계를 사용하지 않은 애플리케이션이 엄청난 결과 세트로 인해 서버를 죽이고 한계가있는 경우 리소스 사용률이 엄청나게 감소하는 것을 보았 기 때문에 이것을 언급했습니다.

자세한 내용은이 페이지를 확인하십시오. MySQL 문서 : LIMIT 최적화


링크 한 페이지는 다음과 같습니다. "LIMIT로 몇 개의 행만 선택하는 경우 MySQL은 일반적으로 전체 테이블 스캔을 선호하는 경우에 인덱스를 사용합니다." 쿼리 자체가 항상 평소처럼 처리되는 것처럼 보이지는 않습니다.
che

좋은 지적. 나는 EXPLAIN을 사용하여 관찰을 기반으로 일반화했습니다. 잡아 주셔서 감사합니다.
rjamestaylor

링크는 대단히 감사합니다. FWIW,이 답변의 대부분은 Limit가 없으면 큰 결과 집합 이있을 수 있는 상황에 적용되는 것 같습니다 . 질문은 한 행만 성공적으로 일치 할 때 중요한지 여부를 묻는 것입니다. 이 경우 "결과 세트"는 1 행 (제한 없이도)입니다.
ToolmakerSteve

5

돌아 오는 결과가 1 개뿐이면 아니요, LIMIT로 인해 더 빨리 처리되지 않습니다. 많은 결과가 있고 첫 번째 결과 만 필요하고 GROUP 또는 ORDER by 문이없는 경우 LIMIT가 더 빠르게 만듭니다.


2
첫 번째 발생을 찾은 후 검색을 중지하기 때문에 고유 / 기본 키가없는 경우 1 행으로도 더 빠를 것입니다
the_nuts

크리스, 첫 문장은 두 가지 방법 중 하나로 읽을 수 있습니다. "단 하나의 행만 반환 될 수 있습니다"(예 : 고유 한 열 쿼리)를 의미한다면, 당신이 말하는 것은 사실입니다. OTOH, "일치하는 결과가 하나만 발견 될 때마다"제한이 더 빠르지 않다는 뜻이라면 확실합니까? 때때로 추가 페이지를 가져와야하는 것을 피하지 않습니까?
ToolmakerSteve

5

간단히 말해 대답은 '예'입니다. 결과를 1로 제한하면 하나의 결과를 "예상"하는 경우에도 데이터베이스가 모든 레코드를 조사하지 않기 때문에 쿼리가 더 빨라집니다. 쿼리와 일치하는 레코드를 찾으면 단순히 중지됩니다.


1
이 답변은 오해의 소지가 있습니다. 다른 답변 (7 년 전)에 대한 주석에서 볼 수있는주의 사항이 없기 때문에 DB가 하나의 레코드 만 일치 할 수 있다는 것을 알고 (예 : 고유 한 열 쿼리) Limit 1은 효과가 없습니다.
ToolmakerSteve

정말? 쿼리 최적화 프로그램은 특정 조건 이 하나의 레코드 만 반환 될 수 있음을 보장 한다는 사실을 이용할 수 있습니다. 귀하의 답변이 모든 상황에서 정확하지 않다는 점을 지적했습니다. (따라서 몇 년 전에 이미 말한 것에서 가치를 뺍니다.) 동의하면 내 의견의 정확성을 인정할 수 있습니다. 동의하지 않는 경우 이유를 명확히 할 수 있습니다.
ToolmakerSteve

1

실제로 하나의 결과 만 기대한다면 쿼리에 LIMIT를 추가하는 것이 좋습니다. 나는 MySQL의 내부 작동 방식을 모르지만, 끝에서 1로 다시 자르기 위해 100'000 개 이상의 레코드 결과 집합을 수집하지 않을 것이라고 확신합니다 ..

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.