2014-11-07 2 views
-1

기본 성능 질문이있을 수 있습니다. SQL 쿼리를 많이 했었지만 복잡한 내부 조인 등은별로하지 않았습니다. 여기에 있습니다 :INNER JOIN이 포함 된 mySQL 쿼리 성능

나는 4 개의 테이블, 국가, 지역, 직원 및 거래 데이터베이스를 보유하고 있습니다.

거래가 직원 및 국가와 연결됩니다. 직원들은 지역과 연결됩니다. 필요한 보고서를 작성하기 위해 필자는 mySQL 데이터베이스에 대해 SQL 쿼리를 처리하는 PHP 스크립트를 실행하고 있습니다.

SELECT trans.transactionDate, agent.code, agent.type, trans.transactionAmount, agent.territory  
FROM transactionTable as trans 
INNER JOIN 
(
    SELECT agent1.code as code, agent1.type as type, territory.territory as territory FROM agentTable as agent1 
    INNER JOIN territoryTable as territory 
    ON agent1.zip=territory.zip 
) AS agent 
ON agent.code=trans.agent 
ORDER BY trans.agent 

약 50,000 개의 레코드가 에이전트 테이블에 있고 200,000 개가 넘는 트랜잭션 테이블이 있습니다. 다른 두 명은 상대적으로 작습니다. 이 쿼리를 실행하는 데 약 7 분이 소요됩니다. 그리고 아직 네 번째 테이블을 삽입하지 않았습니다.이 테이블은 transactionTable (국가)의 필드를 countryTable (국가)의 필드에 연결하고 countryTable (영역)의 필드를 반환해야합니다.

그래서, 두 가지 질문 :

  1. 내가 논리적으로 transactionTable과 countryTable 사이의 연결을 둘 것?

  2. 누구나이 방법을 제안 할 수 있습니까?

감사합니다.

+0

테이블 구조를 게시 할 수 있으면 많은 도움이됩니다. 쿼리의 가장 큰 문제점은 조인 내부의 SELECT입니다. 그것은 영원히 걸릴 것입니다. 또한 테이블의 색인이 올바르게 작성되었는지 확인해야합니다. –

답변

0

질문이 동등해야합니다

빠르게 작동하기 위해
SELECT tx.transactionDate, 
     a.code, 
     a.type, 
     tx.transactionAmount, 
     t.territory 
FROM transactionTable tx 
JOIN agentTable a  ON tx.agent = a.code 
JOIN territoryTable t ON a.zip = t.zip 
ORDER BY tx.agent 

, 당신은 다음과 같은 인덱스를 당신의 테이블에 있어야합니다

SELECT tx.transactionDate, 
     a.code, 
     a.type, 
     tx.transactionAmount, 
     t.territory 
FROM transactionTable tx, 
    agentTable a, 
    territoryTable t 
WHERE tx.agent = a.code 
    AND a.zip = t.zip 
ORDER BY tx.agent 

또는 이것에 당신이 JOIN 사용하려는 경우

:

CREATE INDEX transactionTable_agent ON transactionTable(agent); 
CREATE INDEX territoryTable_zip  ON territoryTable(zip); 
CREATE INDEX agentTable_code  ON agentTable(code); 

(기본적으로 모든 필드는 WHERE의 일부이거나 JOIN 제약 조건을 인덱싱해야합니다.)

즉, 테이블 구조는 우편 번호와 같이 고유하지 않은 필드가 분명히 결합되어 있다는 점에서 의심스러워 보입니다. 에이전트 ID, 트랜잭션 ID 등과 같은보다 고유 한 엔티티로 실제로 참여하고 싶다면 쿼리가 많은 중복 데이터를 생성하고 실제로 느릴 것으로 기대합니다.

한 번 더 메모 : INNER JOIN은 간단히 JOIN과 같으며 중복 절을 입력 할 필요가 없습니다.

+0

첫 번째 예에서 구조를 사용했으며 30 분에 진행됩니다. 그래서 거기에 뭔가 잘못된 것이 있습니다. 또한 필드에 조인하는 것과 같이 지역 테이블에는 zip이라는 고유 식별자가 있습니다. 각 우편 번호에 대해 하나의 레코드 만 있습니다. –

+0

내가 말했듯이,이 쿼리는 당신과 같습니다. 당신은 무엇을하고 있는지 다시 생각할 필요가 있습니다. 테이블 구조와 이들 간의 관계를 게시하면 Google에서 도움을받을 수 있습니다. – mvp

관련 문제