2012-09-11 7 views
-1

총 5 개의 테이블에서 여러 테이블의 열을 가져 오는 쿼리를 만들어야합니다. 왼쪽 조인의 요지를 얻게되어 기쁩니다. 필요한 결과를 얻는다면, 유일한 문제는 속도입니다. 나는 색인/키에 대해 약간 분실되어 있습니다. 아마도 저의 경우는 제가 온라인으로 읽은 모든 예들에 비 전형적인 것이기 때문입니다. 내 테이블의 "고유 한"ID는 모든 테이블에서 기본 키가 아니며 해당 ID는 테이블에서 여러 행을 가질 수 있기 때문에 (기록/감사 목적). id는 몇 가지 테이블 (##/### 및 ## - ###)에서 서로 다른 형식이기 때문에 일치시키는 함수가 큰 속도를 늦출 수 있습니다. 지금까지 코드를 붙여 넣기가 더 쉬울 수도 있습니다 (단 3 개의 테이블 - 3을 먼저 정복 할 때까지는 모든 것을 수행하지 않습니다!) 누군가는 인덱스와 키를 사용하여 개선하는 방법을 제안 할 수 있습니다.MySQL 트리플 트리플 조인 최적화

SELECT dc.URN,dc.GuideName,dc.GuideStreet,ss.categorycalc,pm.initiatedate 
FROM dc 
LEFT JOIN pm 
ON dc.URN = pm.URN 
LEFT JOIN ss 
ON dc.URN = replace(ss.URN,"/","-") 
WHERE dc.GuidePCode LIKE 'WA9%' 
ORDER BY pm.Status ASC; 

난 그냥 모든 것을 데이터베이스를 시작하는 작은 조언을 평가하고 '제대로 할'것 등 - 이미 특정 방식으로 특정 테이블에 데이터를 삽입하도록 코딩 프로그램이 많이있다. 따라서 고유 ID의 구조와 특정 테이블에 쓰여지는 방식을 변경하는 것은 실제로 불가능합니다. 이미 가지고있는 데이터에 대한 보고서를 작성하는 데 집중해야합니다. "WA9"부분은 사용자가 검색하려는 항목에 따라 변경됩니다.

+1

해당 쿼리의 [쿼리 실행 계획] (http://dev.mysql.com/doc/refman/5.5/en/execution-plan-information.html)은 무엇입니까? 거기서 시작하거나 결과를 게시하고 각 테이블에 대한'CREATE TABLE' 구문과 인덱스를 보여줍니다. 계속할 질문에 충분한 정보가 없습니다. – drew010

답변

2

먼저 EXPLAIN을 수행합니다. 적절한 사용에 대한 MySQL의 설명서를 확인하지만, 기본적으로 다음과 같습니다은 "키"열에서

EXPLAIN SELECT dc.URN,dc.GuideName,dc.GuideStreet,ss.categorycalc,pm.initiatedate 
FROM dc 
LEFT JOIN pm ON dc.URN = pm.URN 
LEFT JOIN ss ON dc.URN = replace(ss.URN,"/","-") 
WHERE dc.GuidePCode LIKE 'WA9%' 
ORDER BY pm.Status ASC; 

봐. 테이블 행에서 비어 있으면 해당 필드에 인덱스가 필요합니다. 나는 당신이 이미하지 않은 경우 다음과 같은 추가 제안 :
이 (BTW, 먼저 테스트 환경에서이 작업을 실행) 나는 테이블 SS에 인덱스를 추가하려고 말을

ALTER TABLE dc ADD INDEX URNIdx (URN); 
ALTER TABLE pm ADD INDEX URNIdx (URN); 
ALTER TABLE dc ADD INDEX GuidePCodeIdx (GuidePCode); 

을하지만, URN과 동일한 정의를 사용하여 ss에 URN이라는 새로운 열을 만드는 것이 더 좋습니다. 다음이 업데이트를 실행

UPDATE ss SET URNdashed = replace(ss.URN, "/", "-"); 

또한 URNdashed에 인덱스를 추가

ALTER TABLE ss ADD INDEX URNdashedIdx (URNdashed); 

을 다음 변경 : 그 도움이된다면

ON dc.URN = replace(ss.URN,"/","-") 
to 
ON dc.URN = URNdashed 

을 참조하십시오. 나는 너를 올바른 방향으로 인도하기를 희망한다!

+0

첫 번째 게시물에 대단히 멋지다! – AllInOne

+0

감사합니다. 나는 ss 테이블이 myisam이고 나머지는 innodb 인 것을 이후에 발견했다. 나는 추측 할 것이고 이것은 하나의 요인이다. 새 행이 ss에 삽입 될 때마다 항아리의 ## - ### 버전이 새 열로 복사되도록 트리거를 어떻게 설정할 수 있습니까? urns와 category calc만을위한 새로운 innodb 테이블을 설정하는 것이 더 낫겠습니까? – pedromillers

+0

다른 테이블 타입은 JOINs ...와 관련된 문제가 아니어야합니다. EXPLAIN이 인덱스가 사용되고 있다는 것을 보여 주면 오케이 야합니다. 나는 항상 그 (것)들을한다. 그것들은 같은 타입과 길이가되어야 할 수도 있습니다. 그래서 만약 하나가 _TINYINT (1) _로 정의된다면 다른 하나도 역시 그렇게되어야합니다. 길이를 줄이면 열을 자르지 않으므로'최대 MAX (길이 (pm.URN)) FROM pm'을하십시오. 순간적으로 트리거를 설명 할 시간이 없지만, 응용 프로그램에서 수행하는 것 외에 가능한 해결책입니다. ** Googling ** MySQL 트리거 예제 **를 권해드립니다. – Carlos