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
완전평가 또는 부분평가의 이론이 있다.의 쿼리 및 첫 번째 표현인 경우and
false로 평가하면 더 이상 체크하지 않습니다.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
'source' 카테고리의 다른 글
UNIX 타임스탬프를 포맷된 날짜 문자열로 변환 (0) | 2022.09.14 |
---|---|
어레이 요소를 한 어레이 위치에서 다른 어레이 위치로 이동합니다. (0) | 2022.09.14 |
PHP 5.2.8에서 두 개의 Date Time 개체를 비교하려면 어떻게 해야 합니까? (0) | 2022.09.14 |
Vuex getter가 업데이트되지 않음 (0) | 2022.09.14 |
스프링 크론 vs 일반 크론? (0) | 2022.09.14 |