2010-12-15 4 views
7

의 내가 쿼리 같이 있다고 가정 해 봅시다 : MySQL이 결과를 검색 할 때 모든 조건을 확인하기 위해 계속되면 궁금MySQL의 - AND 조건

SELECT bla WHERE foo LIKE '%bar%' AND boo = 'bar' AND whatvr IN ('foo', 'bar')... 

. 예를 들어. fooLIKE %bar%이 아닌 경우 boo = 'bar' 등으로 계속 확인합니까?

마지막에 사실이 아닐 가능성이 적은 조건을 넣는 것이 더 빠르지 않습니까? 그것이 내가 여러 조건이 될 것입니다 여부에 대한 보장이 있다고 생각하지 않습니다

답변

4

:) SQL에 관해서

는이 바보 같은 질문 것으로 보인다 경우 미안 해요, 완전한 멍청한 놈이야 단락되어 있지만 ...

일반적으로 쿼리 최적화 프로그램을 블랙 박스로 간주하고 반대의 증거가없는 한 정상적으로 작업을 수행해야합니다. 옵티 마이저의 역할은 요청 된 데이터를 최대한 효율적으로 검색하는 것입니다. 가장 효율적인 계획에 단락이 포함된다면 그렇게 할 것입니다. 그렇지 않다면 그렇지 않을 것입니다.

(물론 쿼리 최적화 프로그램이 완벽하지 않습니다. 쿼리가 최적으로 실행되지 않는다는 증거가있는 경우 변경 사항이 있는지 다시 쿼리하거나 다시 설명 할 가치가 있습니다.)

+2

SQL 사양에 따르면이 동작은 구현에 따라 다릅니다. http://stackoverflow.com/questions/789231/is-the-sql-where-clause-short-circuit-evaluated/909770#909770 – AgentConundrum

1

왼쪽에서 오른쪽으로 (모든 프로그래밍 언어와 반대되는) MySQL 평가 조건에 의존 할 수 없습니다. 이는 "WHERE 절 옵티 마이저"가 인덱싱 된 열을 찾고이 하위 집합을 먼저 찾습니다.

쿼리 최적화의 경우 MySQL 참조 설명서의 Optimizing SELECT Statements 장을 참조하십시오.

2

당신이 찾고있는 것은 MySQL의 단락 평가에 관한 문서입니다. 그러나 나는 이 아닌 사람들이 문서를 찾을 수는 없었지만 그것들을 테스트 해본 결과 claim은 MySQL short-circuits이라고 밝혀졌습니다.

마지막에 참이 될 가능성이 적은 조건을 넣으면 더 빠를 수 있습니까?

아니오, 옵티마이 저는 처리 순서를 최적화하고 (!) 시도합니다. 따라서 테스트의 경우이 아니고은 무엇이든 입력해야합니다.

2

나는 그 것으로 간주하지 않을 것입니다 : Where Optimisations. 이 링크는 다른 비평가가 명령에 우선한다는 것을 설명합니다.

0

첫 번째 조건이 실패 할 때 (대부분의 경우) 단락이 발생하면 가장 먼저 실패 할 가능성이 높은 조건을 넣는 것이 가장 좋습니다.

3 가지 조건이 있고 모두가 참이어야합니다 (AND로 구분). 느린 경우 : 1. 절대로 실패하지 마십시오. 모든 행이 검색되고 성공합니다. 2. 때때로 실패합니다. 모든 행은 보았지만 여전히 성공했습니다. 3. 종종 실패합니다. 모든 행이 살펴 보았고 이번에는 실패합니다. 검색 결과 : 시간이 좀 걸렸지 만 성냥을 찾을 수 없습니다.

빠른 사례 : 1. 자주 실패합니다. 모든 행이 검색되고 일치가 실패합니다. 2. 때때로 실패합니다. 단락으로 인해 검색이 종료 되었기 때문에 살펴 보지 않았습니다. 3. 결코 실패하지 마십시오. 단락으로 인해 검색이 종료 되었기 때문에 살펴 보지 않았습니다. 결과 : 빠르게 나타났습니다. 일치하지 않습니다.

내가 틀렸다면 나를 수정하십시오. 각 행이 광고를 보았으므로 모든 조건이 점검됩니다. 이 점이 더 중요하지 않습니다. 필드가 조건과 동일한 순서로 정렬되는 경우 차이를 측정 할 수 있습니다.