>  기사  >  데이터 베이스  >  하위 쿼리가 포함된 MySQL \"IN\" 쿼리가 명시적 값을 사용하는 것보다 훨씬 느린 이유는 무엇입니까?

하위 쿼리가 포함된 MySQL \"IN\" 쿼리가 명시적 값을 사용하는 것보다 훨씬 느린 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-31 02:09:02628검색

 Why is a MySQL

하위 쿼리와 명시적 값 "IN" 쿼리 간의 성능 차이

MySQL "IN" 쿼리가 하위 쿼리를 사용할 때 쿼리보다 훨씬 느린 이유는 무엇입니까? 명시적 값을 사용하는 경우?

다음 쿼리를 고려하십시오.

<code class="sql">SELECT
COUNT(DISTINCT subscriberid)
FROM
em_link_data
WHERE
linkid IN (SELECT l.id FROM em_link l WHERE l.campaignid = '2900' AND l.link != 'open')</code>

하위 쿼리만 1ms 이내에 완료된다는 사실에도 불구하고 이 쿼리를 실행하는 데 약 18초가 걸립니다.

그러나 하위 쿼리가 명시적인 값으로 대체되는 경우:

<code class="sql">SELECT
COUNT(DISTINCT subscriberid)
FROM
em_link_data
WHERE
linkid IN (24899,24900,24901,24902);</code>

쿼리는 1밀리초 이내에 완료됩니다.

설명

성능 불일치는 MySQL이 하위 쿼리를 평가하는 방식에서 발생합니다. 하위 쿼리는 발생할 때마다 실행됩니다. 즉, 첫 번째 쿼리에서 MySQL은 기본적으로 700만 개의 쿼리를 실행합니다("em_link_data" 테이블의 각 행에 대한 하위 쿼리 평가). 반면 명시적 값을 사용하는 경우 하위 쿼리는 한 번만 평가됩니다.

해결 방법

JOIN을 사용하여 쿼리를 다시 작성할 수 없는 경우 다음을 사용하는 것을 고려할 수 있습니다. 성능 향상을 위한 쿼리 캐시. 쿼리 캐시는 이전에 실행된 쿼리의 결과를 저장하고, 동일한 쿼리가 다시 실행되면 이를 재사용합니다. 이렇게 하면 하위 쿼리가 많은 쿼리의 실행 시간을 크게 줄일 수 있습니다.

쿼리 캐시를 활성화하려면 MySQL 구성 파일에 다음 줄을 추가하세요.

query_cache_type = 1

변경 사항을 적용하려면 MySQL을 다시 시작하세요. 적용됩니다.

위 내용은 하위 쿼리가 포함된 MySQL \"IN\" 쿼리가 명시적 값을 사용하는 것보다 훨씬 느린 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.