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의 대답에서 나온 좋은 조언을 바탕으로, 저는 달려갔습니다.EXPLAIN
OP에 있는 것들과 유사한 몇몇 질문들에.
결과는 다음과 같습니다.
EXPLAIN
와의 질의를 위하여.= 1
:
EXPLAIN
와의 질의를 위하여.IN(1)
:
EXPLAIN
와의 질의를 위하여.IN(1,2,3)
:
보시는 바와 같이 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
할 로 거롭게 할 필요가 없도록 쿼리(참고로 조기 최적화라고 함)
과 같습니다.
"Equals" 연산자가 더 낫고, 13개 행을 스캔하며, "IN"이 모든 행을 스캔합니다.
언급URL : https://stackoverflow.com/questions/9926433/mysql-performance-in-clause-vs-equals-for-a-single-value
'programing' 카테고리의 다른 글
패키지를 사용하여 전역 및 로컬로 종속성을 설치합니다.제이손 (0) | 2023.07.28 |
---|---|
python distutils 설치 방법 (0) | 2023.07.28 |
sqlalchemy 필터여러 열 (0) | 2023.07.23 |
MySQL InnoDB: 'FOR UPDATE'와 'LOCK IN SHARE MODE'의 차이점 (0) | 2023.07.23 |
MariaDB의 IN 문에 잘못된 결과가 있습니까? (0) | 2023.07.23 |