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.