복붙노트

[SQL] A의 조건의 순서는 WHERE 절 MySQL의 성능에 영향을 미칩니 까?

SQL

A의 조건의 순서는 WHERE 절 MySQL의 성능에 영향을 미칩니 까?

나는 많은 수의 행을 검색, 조건 포장 길고 비싼 쿼리를 가지고 있다고 말한다. 또한 회사 ID로, 그 필요가 수천 수백 수십를 좁히는 상당히 검색 할 것을 행 수를 제한하는 것, 하나 개의 특정 조건을 가지고있다.

그것이 내가 이렇게 여부를 MySQL의 성능에 어떤 차이가 있습니까 :

 SELECT * FROM clients WHERE 
       (firstname LIKE :foo OR lastname LIKE :foo OR phone LIKE :foo) AND 
       (firstname LIKE :bar OR lastname LIKE :bar OR phone LIKE :bar) AND 
       company = :ugh

아니면 이거:

 SELECT * FROM clients WHERE 
       company = :ugh AND
       (firstname LIKE :foo OR lastname LIKE :foo OR phone LIKE :foo) AND 
       (firstname LIKE :bar OR lastname LIKE :bar OR phone LIKE :bar) 

해결법

  1. ==============================

    1.아니, 순서는 큰 차이를 만들 안된다. 발견 된 행이 조건과 일치하면, 전체 조건 (부울 논리를 통해 결합 부 조건 모두)는 각 행에 대해 검사된다.

    아니, 순서는 큰 차이를 만들 안된다. 발견 된 행이 조건과 일치하면, 전체 조건 (부울 논리를 통해 결합 부 조건 모두)는 각 행에 대해 검사된다.

    일부 지능형 DB 엔진 (예를 들어 내장 함수를 사용하지 않는 것)을 조건의 부분을 빠르게 평가 될 수있는 추측하고 그 첫 번째, 더 복잡한 (estimatedly) 요소가 나중에 평가받을 평가를 시도합니다. 이것은 비록 DB 엔진이 아닌 SQL에 의해 결정 무언가이다.

  2. ==============================

    2.여기에 있음을 보여 온라인 데모는 절 조건으로 인해 단락에 차이를 만들 수 있습니다 WHERE의 순서 :

    여기에 있음을 보여 온라인 데모는 절 조건으로 인해 단락에 차이를 만들 수 있습니다 WHERE의 순서 :

    http://rextester.com/HJGN96158

    이것은 다음과 같은 쿼리를 실행합니다 :

    -- query #1
    SELECT myint FROM mytable WHERE myint >= 3 OR myslowfunction('query #1', myint) = 1;
    
    -- query #2
    SELECT myint FROM mytable WHERE myslowfunction('query #2', myint) = 1 OR myint >= 3;
    

    이들 사이의 유일한 차이점은 OR 조건에서 피연산자의 순서이다.

    myslowfunction 의도적 잠시 인용하고 로그 테이블에 엔트리가 실행될 때마다 추가하는 부작용이있다. 여기에 두 개의 쿼리 위를 실행할 때 로그인 한 일의 결과는 다음과 같습니다

    myslowfunction called for query #1 with value 1
    myslowfunction called for query #1 with value 2
    myslowfunction called for query #2 with value 1
    myslowfunction called for query #2 with value 2
    myslowfunction called for query #2 with value 3
    myslowfunction called for query #2 with value 4
    

    다른 피연산자는 항상 사실이 아니다 때이 OR 조건의 왼쪽에 표시 할 때 위의 쇼는 느린 기능 번 이상 실행됩니다.

    질문에 따라서 IMO 답 :

    "때때로 할 수있는"입니다.

  3. ==============================

    3.절은별로 중요하지 말아야 경우, MySQL의 이후를 실행하기 전에 쿼리를 최적화합니다 당신의 열 순서. 그러나 나는 당신이 쿼리와 테이블을 분석하는 방법에 대한 기본적인 아이디어를 얻고, 필요한 경우를 최적화하기 위해 MySQL을 참조 설명서에 최적화에 장을 읽으십시오. 개인적으로하지만, 난 항상 비 인덱스 필드 전에 인덱스 필드를 넣어 시도 할 것이고, 순서는 그 행의 수에 따라 그들은 반환해야 함 (가장 제한적인 조건 마지막으로 첫째, 적어도 제한).

    절은별로 중요하지 말아야 경우, MySQL의 이후를 실행하기 전에 쿼리를 최적화합니다 당신의 열 순서. 그러나 나는 당신이 쿼리와 테이블을 분석하는 방법에 대한 기본적인 아이디어를 얻고, 필요한 경우를 최적화하기 위해 MySQL을 참조 설명서에 최적화에 장을 읽으십시오. 개인적으로하지만, 난 항상 비 인덱스 필드 전에 인덱스 필드를 넣어 시도 할 것이고, 순서는 그 행의 수에 따라 그들은 반환해야 함 (가장 제한적인 조건 마지막으로 첫째, 적어도 제한).

  4. ==============================

    4.정교한 DBMS는 조건이 처음으로 평가하는 경우 자신의 결정 할 수 있어야한다. 일부 데이터베이스는 쿼리 실행 방법 "전략"을 표시하는 도구를 제공합니다. MySQL의에서, 예를 들어, 당신은 쿼리 앞에 EXPLAIN 입력 할 수 있습니다. DBMS를 다음은 예로서, 쿼리를 실행하기 위해 수행되는 동작을 인쇄 인덱스 또는 전체 테이블 스캔. 이 두 경우 모두 '회사에 대한 인덱스를 사용할지 여부를 한 눈에 볼 수 있도록.

    정교한 DBMS는 조건이 처음으로 평가하는 경우 자신의 결정 할 수 있어야한다. 일부 데이터베이스는 쿼리 실행 방법 "전략"을 표시하는 도구를 제공합니다. MySQL의에서, 예를 들어, 당신은 쿼리 앞에 EXPLAIN 입력 할 수 있습니다. DBMS를 다음은 예로서, 쿼리를 실행하기 위해 수행되는 동작을 인쇄 인덱스 또는 전체 테이블 스캔. 이 두 경우 모두 '회사에 대한 인덱스를 사용할지 여부를 한 눈에 볼 수 있도록.

  5. ==============================

    5.수학적으로 예 그것은 효과가있다. 뿐만 아니라 SQL 쿼리한다. 오히려 함께 및 / 또는 표현이있을 때마다 모든 프로그래밍 언어입니다. 전체 평가 또는 부분 평가의 이론이 작동합니다. false로를 사용하며 쿼리의 첫 번째 표현식 및 평가하여 그것을 더 확인하지 않습니다. 아무것도 수익률의 허위와 거짓을 AND 연산으로. Similerly이나 표현식에서 첫 번째는 더 확인하지 않습니다에 해당하는 경우.

    수학적으로 예 그것은 효과가있다. 뿐만 아니라 SQL 쿼리한다. 오히려 함께 및 / 또는 표현이있을 때마다 모든 프로그래밍 언어입니다. 전체 평가 또는 부분 평가의 이론이 작동합니다. false로를 사용하며 쿼리의 첫 번째 표현식 및 평가하여 그것을 더 확인하지 않습니다. 아무것도 수익률의 허위와 거짓을 AND 연산으로. Similerly이나 표현식에서 첫 번째는 더 확인하지 않습니다에 해당하는 경우.

  6. ==============================

    6.이 영향을주지해야하지만, 당신이 확실하지 않은 경우, 왜 당신은 단순히 그것을 밖으로 시도하지? 하나의 테이블에서 선택에 어디-조항의 순서 차이는 없습니다 만, 여러 테이블을 조인하는 경우의 순서는의 performace를 (때로는)에 영향을 미칠 수 합류했다.

    이 영향을주지해야하지만, 당신이 확실하지 않은 경우, 왜 당신은 단순히 그것을 밖으로 시도하지? 하나의 테이블에서 선택에 어디-조항의 순서 차이는 없습니다 만, 여러 테이블을 조인하는 경우의 순서는의 performace를 (때로는)에 영향을 미칠 수 합류했다.

  7. ==============================

    7.나는 어디 조항의 순서가 어떤 영향을 생각하지 않습니다. 나는 MySQL의 쿼리 최적화 어디 절을 먼저 가장 큰 부분 집합을 멀리 필터 있도록 적절를보고으로 재구성 것이라 생각합니다.

    나는 어디 조항의 순서가 어떤 영향을 생각하지 않습니다. 나는 MySQL의 쿼리 최적화 어디 절을 먼저 가장 큰 부분 집합을 멀리 필터 있도록 적절를보고으로 재구성 것이라 생각합니다.

    이야기에 대한 조인 할 때 다른 거래입니다. 최적화의 시도도 여기 순서,하지만하지는 항상 인덱스를 사용하지 않는 때로는 가장 좋은 방법을 찾아. SELECT는 STRAIGHT 가입 및 FORCE INDEX는 쿼리 담당하자.

  8. ==============================

    8.아니 그것은, 필요한 테이블을 선택하고 행 단위로 평가하지 않습니다. 주문은 임의의 수 있습니다.

    아니 그것은, 필요한 테이블을 선택하고 행 단위로 평가하지 않습니다. 주문은 임의의 수 있습니다.

  9. from https://stackoverflow.com/questions/3043042/does-the-order-of-conditions-in-a-where-clause-affect-mysql-performance by cc-by-sa and MIT license