안내
본 문서는 블로그의 운영자인 본인이 Stackoverflow에 올린 답변을 정리한 글입니다.
Stackoverflow URL
http://stackoverflow.com/questions/20392611/is-there-any-other-way-to-write-this-query/20392902
질문
다음과 같은 EXISTS를 이용한 SELECT문을 수행 중인데 수행 시간이 18분이나 된다. 좀 더 빠르게 할 수 있는 방법은 없는가?
SELECT COUNT(*) FROM psverify_interaction_numeric_ip_address a
WHERE EXISTS (
SELECT 1 FROM Xwalk_GeoLiteCity_Blocks
WHERE startIpNum <= a.numeric_ip_address AND endIpNum >= a.numeric_ip_address
);
+----------+
| COUNT(*) |
+----------+
| 240 |
+----------+
1 row in set (18 min 2.00 sec)
답변
MySQL에서 correlated sub-query는 대부분 속도가 느리다. 다음과 같이 INNER JOIN으로 바꾸는 것이 좋겠다.
SELECT COUNT(a.id)
FROM psverify_interaction_numeric_ip_address a
INNER JOIN Xwalk_GeoLiteCity_Blocks b
ON b.startIpNum <= a.numeric_ip_address AND b.endIpNum >= a.numeric_ip_address
“MySQL” 카테고리의 추천 글
- MySQL IN subquery 성능. IN sub query는 가급적 사용을 피하자
- MySQL의 IN() v.s. EXISTS v.s. INNER JOIN 성능 비교
- MySQL INNER JOIN v.s EXISTS 성능 비교
- JOIN에서 중복된 레코드 제거하기
- MySQL 중복 레코드 관리 방법 - INSERT IGNORE, REPLACE INTO, ON DUPLICATE UPDATE
- MySQL GROUP BY 성능 최적화를 위한 INDEX 설계
- MySQL Query Cache를 빠르게 비우기
- MySQL Plugin에 대한 간단한 소개
- MySQL InnoDB Index Statistics
- MySQL Foreign key 사용 시 주의 사항 (Can’t create table (errno: 150))