안내
본 문서는 블로그의 운영자인 본인이 Stackoverflow에 올린 답변을 정리한 글입니다.
Stackoverflow URL
http://stackoverflow.com/questions/20396795/how-can-i-optimize-this-mysql-query-please/20396888
질문
다음과 같은 SELECT문을 수행 중이다. 속도가 느린데 최적화 방법은 없는가?
SELECT a.providerName AS Assureur, b.insuranceType AS Produit, c.votedFor,
c.votedFor2, c.email, c.comment, c.modified
FROM insuranceproviders AS a, insurancetypes AS b, insurancevotes AS c
WHERE a.id = c.providerId
AND b.id = c.insTypeId
답변
다음과 같은 INDEX를 생성하라.
ALTER TABLE insuranceproviders ADD INDEX(id);
ALTER TABLE insurancetypes ADD INDEX (providerID, insTypeId);
ALTER TABLE insurancevotes ADD INDEX(insTypeId);
그리고 JOIN도 다음과 같이 명시적으로 INNER JOIN으로 변경하는 것이 좋다. 다음과 같은 SQL이 질문자의 SQL에 비해 가독성이 좋다. 즉, 테이블간 JOIN이 어떤 컬럼으로 수행되는지 명시적으로 알 수있으며 이는 MySQL Optimizer가 최적화를 하는데도 도움을 주는 것으로 알고 있다.
SELECT a.providerName AS Assureur, b.insuranceType AS Produit,
c.votedFor, c.votedFor2, c.email, c.comment, c.modified
FROM insuranceproviders AS a
INNER JOIN insurancetypes AS b ON a.id = c.providerID
INNER JOIN insurancevotes AS c ON b.id = c.insTypeId
“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))