2013-03-05 2 views
1

를 정렬하지 않는 출력을 설명 나는 다음과 같은 한쿼리 실행 시간 및

SELECT STRAIGHT_JOIN a.* 
    FROM b 
    INNER JOIN a ON a.b_id = b.b_id 
    INNER JOIN c ON dd.a_id = a.id 
    WHERE a.a_type_id = 164 
    AND a.status = 1 
    AND NOT EXISTS (
     SELECT a2.* 
     FROM a a2 
     INNER JOIN c c2 ON c2.a_id = a2.id 
     INNER JOIN d d.a_id = a2.id 
     WHERE a.w_id = 567 
     AND c.ds_id = c2.ds_id 
    ) 
    order by b.id 
    LIMIT 1; 

는 설명 쿼리는 다음과 같은 결과

결과를 설명에서
*************************** 1. row *************************** 
      id: 1 
    select_type: PRIMARY 
      table: b 
      type: index 
    possible_keys: index_b_on_b_id 
      key: PRIMARY 
     key_len: 4 
      ref: NULL 
      rows: 1 
      Extra: 
    *************************** 2. row *************************** 
      id: 1 
    select_type: PRIMARY 
      table: a 
      type: ref 
    possible_keys: PRIMARY,index_a_on_a_type_id,index_a_on_status,index_a_on_b_id,index_a_on_a_type_id_and_status 
      key: index_a_on_b_id 
     key_len: 4 
      ref: b.b_id 
      rows: 1 
      Extra: Using where 
    *************************** 3. row *************************** 
      id: 1 
    select_type: PRIMARY 
      table: c 
      type: ref 
    possible_keys: index_c_on_a_id 
      key: index_c_on_a_id 
     key_len: 4 
      ref: a.id 
      rows: 1 
      Extra: Using where 
    *************************** 4. row *************************** 
      id: 2 
    select_type: DEPENDENT SUBQUERY 
      table: c2 
      type: ref 
    possible_keys: index_c_on_ds_id,index_c_on_a_id 
      key: index_c_on_ds_id 
     key_len: 4 
      ref: c.ds_id 
      rows: 1 
      Extra: 
    *************************** 5. row *************************** 
      id: 2 
    select_type: DEPENDENT SUBQUERY 
      table: d 
      type: ref 
    possible_keys: index_d_on_a_id,index_d_on_w_id 
      key: index_d_on_a_id 
     key_len: 5 
      ref: c2.a_id 
      rows: 1 
      Extra: Using where 
    *************************** 6. row *************************** 
      id: 2 
    select_type: DEPENDENT SUBQUERY 
      table: a2 
      type: eq_ref 
    possible_keys: PRIMARY 
      key: PRIMARY 
     key_len: 4 
      ref: d.a_id 
      rows: 1 
      Extra: Using where; Using index 

을 제공, 스캔 할 행은 하나지만 실제입니다 실행 시간이 1 초 이상입니다. 나는 Explain이 추정치이며 실제 실행은 다를 수 있지만 여기서 최적화 할 수있는 항목이 있는지 (새 인덱스 추가, 쿼리 다시 작성 등) 알고 있습니까?

  • A => 2,585,530

  • B => 10000

  • C => 2,585,525

  • D를 다음과 같이

    테이블의 행 수있다 => 3350381

+0

"제한 1"을 제거하면 평가되는 행 수는 얼마나됩니까? – Steve

+0

@ 스티브, "제한 1"을 제거하면 20373 개의 행이 표시됩니다. – bikashp

+0

감사합니다. 일반적인 답을 쓸 것입니다. 나는 당신이 MySQL Enterprise 고객이라고 생각하지 않습니까? – Steve

답변

0

모든 정보 (스키마, 데이터 및 최종 목표)를 모른 채 이러한 질문에 답하기는 정말 어렵지만 일부는 일반적인 방법으로 입력하려고합니다.

쿼리에서 20,373 개의 행을 평가 중이며 그 중 하나만 반환합니다.이 데이터는 버려진 많은 데이터처럼 보이기에 가치가 있습니다. 쿼리를 읽는 것은 당신이하려는 일을 정확히 파악하는 것이 거의 불가능합니다. (내가 이미 언급 한 다른 모든 정보없이) - 그러나 여기서 무슨 일이 일어나고 있는지에 대한 합리적인 아이디어를 얻을 수 있습니다.

쿼리의 "존재하지 않는 (...)"요소를 리팩토링하고 대신 적절한 인덱스가있는 조건문을 사용하여 올바른 데이터를 선택한 다음 나머지 데이터를 다음과 같이 결합하는 것이 좋습니다. 이 첫 번째 쿼리.

이것은 데이터 구조에서는 완전히 가능하지 않을 수도 있지만 제공되는 것으로부터 내가 정말로 권장할만한 것입니다. 이것이 적합하지 않은 경우 자세한 정보 또는 전체 스키마, 샘플 데이터 및 최종 쿼리가 출력해야하는 예제 구조를 포함하여 답변을 편집 할 수 있습니까?