source

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

factcode 2022. 9. 14. 22:12
반응형

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) 

다음은 단락으로 인해 WHERE 절 조건의 순서가 달라질 수 있음을 보여주는 데모입니다.다음 쿼리를 실행합니다.

-- 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는 의도적으로 1초간 sleeve 상태로 되어 실행 시마다 로그 테이블에 엔트리를 추가하는 부작용이 있습니다.은 두가지 할 때 는 결과를 . 2가지 쿼리 실행 시 로그가 기록됩니다.

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는 다음과 같은 질문에 답합니다.

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

'가끔은 할 수 있다'는 거죠

아니요, 주문은 큰 차이가 없습니다.어떤 행이 조건에 일치하는지 확인할 때 각 행에 대해 전체적으로(부울 로직을 통해 결합된 모든 하위 조건) 조건이 검사됩니다.

일부 지능형 DB 엔진은 조건의 어떤 부분을 더 빨리 평가할 수 있는지 추측하고(예: 내장 함수를 사용하지 않는 부분) 먼저 평가한 후 더 복잡한(추정적으로) 요소를 나중에 평가하려고 시도합니다.이것은 SQL이 아닌 DB 엔진에 의해 결정됩니다.

MySQL은 쿼리를 실행하기 전에 최적화하므로 where 절의 열 순서는 중요하지 않습니다.그러나 MySQL 레퍼런스 매뉴얼의 Optimization 을 읽고 쿼리와 테이블을 분석하고 필요에 따라 최적화하는 방법에 대한 기본적인 아이디어를 얻을 것을 권장합니다.개인적으로는 인덱스되지 않은 필드보다 인덱스된 필드를 먼저 배치하고 반환해야 하는 행 수에 따라 정렬합니다(가장 제한적인 조건이 먼저이고 가장 제한적이지 않은 마지막).

수학적으로 네 효과가 있습니다.SQL Query뿐만 아니라 모든 프로그래밍 언어에서 다음과 같은 표현이 있을 때마다and/or완전평가 또는 부분평가의 이론이 있다.의 쿼리 및 첫 번째 표현인 경우andfalse로 평가하면 더 이상 체크하지 않습니다.Anding with anyth with anything false는 false를 생성합니다.또는 식에서 Similerly는 첫 번째가 참일 경우 더 이상 체크하지 않습니다.

고도의 DBMS는 어느 조건을 먼저 평가할지를 스스로 결정할 수 있어야 합니다.일부 데이터베이스는 질의 실행 방법을 "전략"으로 표시할 수 있는 도구를 제공합니다.MySQL에서는 쿼리 앞에 입력할 수 있습니다.그런 다음 DBMS는 쿼리 실행을 위해 수행한 작업(예: 인덱스 또는 전체 테이블 검색)을 인쇄합니다.따라서 두 경우 모두 '회사'에 대한 인덱스를 사용하는지 여부를 한 눈에 확인할 수 있습니다.

아무 효과도 없겠지만 잘 모르겠다면 그냥 시도해 보는 게 어때요?단일 테이블에서 선택한 where-module의 순서는 차이가 없지만 여러 테이블을 결합할 경우 결합 순서가 성능에 영향을 줄 수 있습니다(경우에 따라).

where 조항의 순서는 영향을 주지 않는다고 생각합니다.MySQL 쿼리 옵티마이저는 가장 큰 서브셋을 먼저 필터링할 수 있도록 절이 적합하다고 생각되는 부분을 재구성할 것입니다.

조인을 말할 때는 또 다른 문제입니다.옵티마이저는 여기서도 순서를 변경하려고 하지만 항상 최적의 방법을 찾지는 못하고 인덱스를 사용하지 않을 수도 있습니다.스트레이트 조인 및 강제 인덱스를 선택하면 쿼리를 담당할 수 있습니다.

그렇지 않습니다. 필요한 테이블이 선택되고 행별로 평가됩니다.순서는 임의일 수 있습니다.

언급URL : https://stackoverflow.com/questions/3043042/does-the-order-of-conditions-in-a-where-clause-affect-mysql-performance

반응형