2010-03-01 7 views
2

쿼리 1 :MySQL의 쿼리 최적화

SELECT cid, 
     dl 
FROM chal 
WHERE cid IN (
     SELECT cid 
     FROM c_users 
     WHERE uid = 636587 
     ); 

질의 2 :

CID가 chal CID 및 UID의 기본 키가 c_users에 색인되어
SELECT chal.cid AS cid, 
     chal.dl AS dl 
FROM chal, 
     c_users 
WHERE uid = 808 
     AND chal.cid = c_users.cid; 

는, CID는 고유하지 않습니다; 위의 쿼리의

어느 것이 나은가?

설명

말한다 다음

  • 검색어 1, 즉 모든 인덱스와 index_subquery

  • 쿼리의 두 가지 유형을 사용하여 2 사용자 인덱스, 즉 ALL 및 심판

I의 두 가지 유형 cid가 테이블 chal의 기본 키이지만 두 쿼리가 모두 ALL의 인덱스 유형이라고 말하는 지 궁금합니다.

답변

0

이러한 쿼리는 동일하지 않습니다. 두 번째는 두 개의 레코드를 반환 c_users 동안 주어진 사용자에 대한 동일한 2cid S가 있다면

, 제 질의는 cid 당 1 개 레코드를 반환한다.

index_subqueryIN 하위 쿼리에 IN 테스트 식을 밀어 첫 경기에 TRUE를 반환 MySQL의 최적화입니다.

첫 번째 쿼리는 항상 chal을 선도 테이블로 사용하고 두 번째 쿼리는 chalc_users 사이에서 선택할 수 있으며 대부분 c_users을 선택합니다.

당신은 c_users (uid, cid)에 복합 인덱스를 생성해야합니다.

1

cid가 c_users에 색인되어 있습니까? 그것이 아니라면 전체 테이블 스캔 (일명 "ALL")이 보장됩니다.

+0

cid는 c_users와 chal에서 모두 색인 생성됩니다. –

1

난 당신이 다음 엄지 손가락의 규칙으로, 두 번째 쿼리가 빠를 것이다, 어떤 쿼리가 빨라집니다 요구하는 가정합니다. 그러나 적은 수의 행이있는 테이블에서는 그 차이가 미미합니다. 내가 사용하지 않을

1

조인 선택하거나 중첩.

내가 훨씬 더 빨리 당신이 확장으로 될 것입니다 응용 프로그램 수준에서 두 개의 SQL을 작성합니다.

당신의 선택은 모두 테이블에 기본 키를 기반으로해야합니다. 즉 cid