2012-07-02 12 views
0

내 Mysql 문에 실제 문제가 있습니다. 몇 가지 테이블을 함께 조인하고 다른 테이블의 평균 값으로 쿼리해야합니다. 이 지금 MYSQL 쿼리 (효율성)에 대한 문제

SELECT 
    ROUND(avg(re.rating), 1)AS avg_rating, 
     s.staff_id, s.full_name, s.mobile, s.telephone, s.email, s.drive 
    FROM staff s 

    INNER JOIN staff_homes sh 
    ON s.staff_id=sh.staff_id 
    INNER JOIN staff_positions sp 
    ON s.staff_id=sp.staff_id 
    INNER JOIN reliability re 
    ON s.staff_id=re.staff_id 
    INNER JOIN availability ua 
    ON s.staff_id=ua.staff_id 

    GROUP BY staff_id 
    ORDER BY avg_rating DESC 

은 내가이 오류를 얻고 있지만이 작업을 생각 ... 내가 가진 것입니다 "선택은 MAX_JOIN_SIZE 행 이상을 검사 것이다 확인하여 WHERE 및 사용 SET SQL_BIG_SELECTS = 1 또는 SET SQL_MAX_JOIN_SIZE = # 괜찮 으면 선택 ".

나는 이것이 너무 많은 조인을 가지며 공유 호스팅을 통해 커다란 쿼리가 실행되는 것을 허용하지 않는다고 생각합니다.

제가 알고 싶은 것은 오류가 무엇을 의미하는지 (나는 봤지만 대답을 이해하지 못함) 어떻게 내 질문을보다 효율적으로 만들 수 있습니까?

도움을 주시면 감사하겠습니다. 감사합니다

편집 :

나는 조인을 필요로하는 이유는

 SELECT 
ROUND(avg(re.rating), 1)AS avg_rating 

, s.staff_id, s.full_name, s.mobile, s.telephone, s.email, s.drive 
FROM staff s 

INNER JOIN staff_homes sh 
ON s.staff_id=sh.staff_id 
INNER JOIN staff_positions sp 
ON s.staff_id=sp.staff_id 
INNER JOIN reliability re 
ON s.staff_id=re.staff_id 
INNER JOIN availability ua 
ON s.staff_id=ua.staff_id 

WHERE s.full_name LIKE '%' 
AND s.drive = '1' 
AND sh.home_id = '3' 
AND sh.can_work = '1' 
AND sp.position_id = '3' 
AND sp.can_work = '1' 


GROUP BY staff_id 
ORDER BY avg_rating DESC 

편집 2

... 그래서 내가 지금 같은 검색 기능을 기반으로 테이블을 조회 할 수있다이 있었다 내 설명의 결과. 또한 MYSQL과 잘 맞지 않아 외래 키를 어떻게 설정할 수 있습니까?

1 SIMPLE UA ALL NULL NULL NULL NULL 14 여분의 임시 사용

ID SELECT_TYPE 테이블 유형이 possible_keys 키있는 key_len 심판 행; 파일롯 사용

1 단순 전체 다시 NULL NULL NULL NULL 50 사용 위치; 조인 버퍼 사용

1 SIMPLE sp ALL NULL NULL NULL NULL 84 where using; 조인 버퍼 사용

1 SIMPLE sh ALL NULL NULL NULL NULL 126 사용 위치; 버퍼

1 SIMPLE의 eq_ref PRIMARY PRIMARY 4 web106 - prestwick.ua.staff_id에게 가입하여 1

편집 3 : 감사 LC, 내 외래 키가 올바르게 설정되지 않은했다. 문제가 해결되었습니다

+2

왜 모든 조인이 필요합니까? select 문은 staff 및 reliability 테이블 만 참조합니다. – OTTA

+0

당신은 당신의 SQL에서 정확히 무엇을 원합니까? 테이블 구조를 제공 할 수 있습니까? 아마도 조인을 줄일 수 있습니다. –

+0

MAX_JOIN_SIZE는 join 문이 반환 할 수있는 레코드 수를 제한하는 MYSQL 설정입니다. 여러 가지 이유로 공유 호스팅 제공 업체가 설정했을 수 있습니다. http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_max_join_size –

답변

0

사용중인 데이터베이스에 따르면 최적화가 하위 쿼리를 사용하면 더 빠르지 않을 수 있습니다.

쿼리에 2 개 병목 현상이있을 수 있습니다 :

  • 시도가 쿼리의 평균 기능을 제거 할 수 있습니다. 쿼리 속도가 빨라지면 하위 쿼리로 바꾸고 무슨 일이 일어나는지보십시오.

  • 여러 조인은 성능을 저하시키는 경우가 많으며 db 스키마를 수정하는 것 외에는 수행 할 수있는 작업이 없습니다. 가장 간단한 해결책은 데이터를 미리 계산하고 DB 엔진의 작업을 줄이는 테이블을 만드는 것입니다. 이 테이블은 내재 된 테이블의 데이터를 수정할 때 트리거되는 저장 프로 시저로 수행하거나 PHP 응용 프로그램에서 테이블 값을 수정할 수도 있습니다.

1

아마도 더 많은 인덱스를 사용해야합니다.