2013-02-28 3 views
0

위와 같은 단순한 조인은 훌륭하지만 기술 테이블이 매우 크기 때문에 속도가 매우 느리다는 생각이 듭니다. uid의 타임 스탬프를 추적 할 때 uid의 많은 인스턴스가 있으므로 뚜렷합니다. 이 쿼리를 빠르게하는 가장 좋은 방법은 무엇입니까?JOIN 쿼리 속도 향상

SELECT DISTINCT tech.uid, 
       listing.empno, 
       listing.firstname, 
       listing.lastname 
FROM tech, 
     listing 
WHERE tech.uid = listing.empno 
ORDER BY listing.empno ASC 
+1

하십시오 같은 성능 튜닝에 유용한 많은 옵션은, 우리에게'EXPLAIN' 및 테이블 구조를 보여주고있다. 이는 체크 엔진이 켜진 상태에서 자동차를 가져 오는 것과 진단을 읽지 않는 것과 같습니다. 명시 적'JOIN' 문법을 사용하는 것이 더 우수하고 표준적인 * 연습 – Kermit

+0

인덱스 사용에 대해 조사해 보셨습니까? –

+3

처음에는 색인이없는 경우 tech.uid 및 listing.empno에 색인을 추가 할 수 있습니다. – Kamil

답변

4

먼저 각각의 테이블에 tech.UID 및 listing.EmpNo에 색인을 추가하십시오. 당신은 당신이이 같은 다시 쓰기 쿼리에 시도 할 수 있습니다 인덱스 있는지가 된 후 :이 단어의 실행 계획에 대한 몇 가지 힌트를 얻을 수있는 쿼리하기 전에 EXPLAIN 넣고, 충분히 빨리 아직도 있다면

SELECT DISTINCT tech.uid, listing.EmpNo, listing.FirstName, listing.LastName 
FROM listing INNER JOIN tech ON tech.uid = listing.EmpNo 
ORDER BY listing.EmpNo ASC; 

은 쿼리.

EXPLAIN SELECT DISTINCT tech.uid, listing.EmpNo, listing.FirstName, listing.LastName 
    FROM listing INNER JOIN tech ON tech.uid = listing.EmpNo 
    ORDER BY listing.EmpNo ASC; 

게시 결과 더 나은 통찰력을 얻을 수 있습니다.

+0

완벽, 지침에 따라 색인을 이미 추가 했으므로 대답이 빨리 이루어집니다. Explain 팁을 주셔서 감사합니다. 앞으로 사용하겠습니다. –

1
  1. 이것은 매우 간단한 쿼리, 그것은 도움이되기를 바랍니다. SQL에서 수행 할 수있는 것 - 인덱스가없는 경우 JOIN/WHERE 및 ORDER BY 절 (tech.uid, listing.empno)에 사용 된 필드에 인덱스을 추가 할 수 있습니다.

  2. NULL 값을 가진 JOIN 필드가있는 경우 성능이 저하 될 수 있습니다. WHERE 절 (WHERE tech.uid is not null and listing.empno not null)으로 필터링해야합니다. JOIN의 행 수가 많고 NULL 필드에있는 경우 - 그 데이터는 데카르트 결과를 생성 할 수 있습니다 (영어로 전화하는 방법이 확실하지 않음). 엄청난 수의 행이 포함될 수 있습니다.

  3. MySQL 구성을 변경할 수 있습니다. read_buffer_size 등 key_buffer_size, sort_buffer_size, tmp_table_size 변수, max_heap_table_size,

+0

Re : Your # 2. 명시 적 내부 조인을 사용하면 암시 적 조인보다 빠른 성능을 낼 수 있다고 말하는 것입니까? –

+0

@ PM77-1 아마도 당신 말이 맞을 것입니다. 나는 대답으로 정정했고 또 다른 팁을 더했다. – Kamil