programing

MySQL 성능 - "IN" 절 vs.단일 값에 대해 동일(=)

javajsp 2023. 7. 23. 14:03

MySQL 성능 - "IN" 절 vs.단일 값에 대해 동일(=)

이것은 꽤 간단한 질문이고 저는 대답이 "상관없다"라고 생각하지만 어쨌든 저는 질문을 해야 합니다.

PHP로 구축된 일반적인 sql 문:

$sql = 'SELECT * FROM `users` WHERE `id` IN(' . implode(', ', $object_ids) . ')';

사전 유효성 검사($object_ids하나 이상의 항목과 모든 숫자 값을 가진 배열입니다.) 대신 다음을 수행해야 합니까?

if(count($object_ids) == 1) {
    $sql = 'SELECT * FROM `users` WHERE `id` = ' . array_shift($object_ids);
} else {
    $sql = 'SELECT * FROM `users` WHERE `id` IN(' . implode(', ', $object_ids) . ')';
}

아니면 확인의 간접비인가요?count($object_ids)실제 sql 문에 무엇이 저장될 가치가 있습니까(있는 경우)?

대부분의 다른 대답들은 결정적인 것을 제공하지 않습니다. 단지 추측일 뿐입니다.그래서, @Namphibian의 대답에서 나온 좋은 조언을 바탕으로, 저는 달려갔습니다.EXPLAINOP에 있는 것들과 유사한 몇몇 질문들에.

결과는 다음과 같습니다.


EXPLAIN와의 질의를 위하여.= 1:

Explain for a query with <code>= 1</code>


EXPLAIN와의 질의를 위하여.IN(1):

Explain for a query with <code>IN(1)</code>


EXPLAIN와의 질의를 위하여.IN(1,2,3):

Explain for a query with <code>IN(1,2,3)</code>


보시는 바와 같이 MySQL은 최적화 기능을 제공합니다.IN(1)마찬가지로= 1이런 종류의 질문에서.@mes의 답변은 더 복잡한 쿼리의 경우 항상 그렇지는 않을 수 있음을 나타내는 것 같습니다.

그래서, 너무 게을러서 운영할 수 없었던 사람들을 위해.EXPLAIN그들 자신, 이제 당신도 알잖아요.예, 다음을 실행할 수 있습니다.EXPLAIN이런 식으로 처리되는지 확인하기 위해 자신의 질문에 답하십시오. :-)

MySQL 문 사이에는 차이가 없으며, In이 하나의 요소일 때 MySQL Optimizer는 IN을 =로 변환합니다.신경쓰지 마세요.

두 가지 모두 큰 범위에서 중요하지 않습니다.데이터베이스와 통신할 때의 네트워크 지연 시간은 다음 중 하나를 훨씬 능가할 것입니다.count($object_ids)머리 위에 또는 그=IN머리 위의저는 이것을 시기상조 최적화의 사례라고 부를 것입니다.

애플리케이션을 프로파일링하고 로드 테스트하여 실제 병목 현상이 어디에 있는지 알아내야 합니다.

설명문을 사용하여 두 쿼리를 실행합니다.MySQL이 수행하는 작업을 보여줍니다.MySQL 최적화는 MySQL이 내부적으로 쿼리를 사용하여 수행하는 작업에 초점을 맞춰야 합니다.실행되는 쿼리를 최적화하는 것은 시기상조입니다.

예를 들어 인덱스가 없는 경우 이 두 쿼리 모두 성능이 저하될 수 있습니다.MySQL의 EXPLE 문은 여기서 골드입니다.따라서 느리게 실행되는 쿼리에 도달하면 EXPLE 문이 그 이유를 보여줍니다.

나는 내부적으로 mysql이 치료할 것이라고 상상합니다.IN (6)와 똑같이 묻다= 6할 로 거롭게 할 필요가 없도록 쿼리(참고로 조기 최적화라고 함)

과 같습니다.enter image description here

"Equals" 연산자가 더 낫고, 13개 행을 스캔하며, "IN"이 모든 행을 스캔합니다.

언급URL : https://stackoverflow.com/questions/9926433/mysql-performance-in-clause-vs-equals-for-a-single-value