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

Barbara Streisand
풀어 주다: 2024-10-31 02:09:02
원래의
627명이 탐색했습니다.

 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!