2011-10-25 5 views
3

두 문장 중 어느 문장이 더 빠르다는 것을 알려주시겠습니까?mysql - "INNER JOIN"또는 "IN". 어느 것이 더 빠릅니까?

1 문장 :

SELECT DISTINCT(t1.user_id) FROM table_users as t1 WHERE t1.user_town IN (SELECT t2.town FROM table_towns as t2) 

번째 문장 :

SELECT DISTINCT(t1.user_id) FROM table_users as t1 
    INNER JOIN (SELECT t2.town FROM table_towns as t2) as t3 ON t1.user_town = t3.town 

내가 사용하는 선택은 일반적으로 조금 더 복잡하다. 그리고 가능하면 값이나 표 선택을 전달할 수 있으므로 IN (...)을 사용하려고합니다.

+0

다른 결과를 피하기 위해 SELECT t1. *에서 SELECT DISTINCT (t1.user_id)로 결과를 변경했습니다. 그것은 보통 내가 정말로 신경 쓰는 것이기 때문에 – Seeker

답변

1

그들은 둘 다 내 눈과 상당히 비슷합니다. 어떤 경우

SELECT t1.* 
FROM table_users t1 
INNER JOIN table_towns t2 ON t1.user_town = t2.town 

, 쿼리에 대한 EXPLAIN plan 말과 라이브 데이터에 대한 몇 가지 벤치 마크를 수행하는 것을 볼 수 : 나는 MySQL의 is not particularly good with subqueries가 주어진 하나의 SELECT가 더 나은 성능을 제공 할 것으로 확신합니다.

0

측정을하고 확실한 설명 플랜을 발행해야합니다. 하지만 그 중 어느 것도 사용하지 않을 것입니다 :

select u.* from table_users as u 
inner join table_towns as t on u.user_town = t.town 
0

IN은 MySQL 용입니다. 오히려 EXISTS을 사용하십시오.

INNER JOIN 꽤 빠를 수 있지만 결과가 반드시 동일하지는 않습니다. 이 경우 (또는 비슷한) 결과를 얻으려면 그룹화 또는 distinct이 필요할 수 있습니다.하지만이 경우에는 내가 안전하다고 생각합니다.

내부 조인을 사용하는 경우, MySQL이 서브 조이스틱을 잘 처리하지 못하기 때문에 조인을 선택하지 마십시오. 그냥 table_towns 테이블 자체에 가입하십시오.

+0

더 이상 최신 MySQL 버전에서는 더 이상 사실이 아닙니다. 'IN (선택 ....)'이 최적화되었습니다. – Johan

+0

더 이상 살인을하지는 않겠지 만, 비교시 훨씬 느립니다. – GolezTrol

+0

@Johan - 어떤 버전이 효과적입니까? 당신이 진실이라고 생각하는 것뿐만 아니라 실제로 테스트 한 것에서도 ** 듣고 싶습니까? ** 여기서'명백한 '=과'IN' 사이의 거대한 불일치 여부에 관심이 있습니다. (http://stackoverflow.com/) 질문/3416076/this-select-query-takes-180-second-finish/3417098 # 3417098)가 수정되었습니다.마크 바이어 (Mark Byer)의 대답 내가 언급 한 의견에 링크 된 내용은 버전 6.0까지 고정 될 예정이 아니라고 말했습니다. –

0

귀하의 질문에 대한 명확한 답은 없습니다. 테이블의 인덱스가 무엇이고 사용중인 DBMS가 사용할 수 있는지 여부에 따라 다릅니다. 나는 ININNER JOIN 및 인스턴스가 INNER JOIN 인 경우에 비해 실행 시간이 단축 된 경우를 보았습니다.

일화 예 (하지만, SQL Server를 사용하여이) :

나는 일반적인 필드를 사용하여 일반 테이블에 임시 테이블에 합류했다. 실행 계획은 실행 계획을 살펴볼 때 두 테이블 사이에 해시 조인 (HASH JOIN)을 보여주었습니다. 실행 시간은 2 초였습니다. INNER JOININ으로 변경하여 subselect으로 해시 조인이 사라지고 실행 시간이 1 초로 단축되었습니다. 이제 주 테이블에서 색인을 사용하고있었습니다.

0

게시 한 2 개의 쿼리가 다른 결과를 생성 할 수 있습니다 (JOIN은 첫 번째 행보다 많은 행을 반환 할 수 있음). 따라서 성능을 비교하는 것이 정확하지 않습니다.

+0

맞습니다. 나는 다른 결과를 피하기 위해 단지 1 개의 필드만을 구별했습니다. – Seeker

+0

이 경우 두 번째 (JOIN 사용)가 약간 더 나쁠 수 있다고 생각합니다 (옵티마이 저가 이동하기에는 영리하지 못하면 'DISTINCT'를 하위 쿼리로 이동하십시오) – a1ex07

관련 문제