2011-03-02 6 views
1

질문 테이블에서 데이터를 얻은 다음 LEFT JOIN 제품 응답을 얻어야합니다. 특정 카테고리의 모든 질문 목록 (약 200 개 카테고리 중 총 16 개 카테고리)이 필요하며 특정 제품 ID에 대한 질문 옆에 제품 답변을 나열하십시오.mySQL 쿼리 최적화 LEFT JOIN

SELECT `questions`.`id`, `questions`.`text`, `questions`.`catalogue_id`, `productanswers`.`answer` 

FROM `questions` 

LEFT JOIN `productanswers` ON `productanswers`.`question_id` = `questions`.`id` 

AND product_id = '2001682' 

WHERE `catalogue_id` IN (1234912,1234913,1234914) 

ORDER BY `catalogue_id` 

약 17 개의 결과가 예상대로 반환됩니다. 이 제품에 대한 답이없는 질문은 Null로 채워집니다.

문제는 쿼리를 실행하는 데 약 23 초가 걸린다는 점입니다. -o 모든 카탈로그 질문으로 전체 쿼리를 작성할 수 없습니다.

어떻게 쿼리를 최적화 할 수 있습니까? 아니면 다른 아이디어가 있습니까?

감사합니다, 태프

+0

테이블 열을 추가하고 질문에 "설명"할 수 있습니까? – frail

답변

3

함께 question_idproduct_id에 복합 (다중 컬럼) 인덱스를 추가

ALTER TABLE productanswers ADD KEY(question_id, product_id) 

참고 : 당신은에 따라 인덱스의 열 순서를 전환 할 수 있습니다 복합 지표에 더 product_id

VS question_id의 선택성은 Docs

참조,
+1

글쎄, 당신은 매일 무언가를 배웁니다! _slight_ 차이를 만들었지 만, 23 초에서 0.0077 ;-) Scrum Meister에게 감사드립니다. – Taff

0

또한 모든 사용자 ID 열에 대해 색인을 가져야하지만 사용자가 가지고 있다고 생각합니다. 정보에 대한 또 다른 정보는 explain 문입니다. http://dev.mysql.com/doc/refman/5.0/en/using-explain.html

+0

내 ID 열이 모두 기본 키로 설정됩니다. 동일한 열에 인덱스를 추가하면 phpmyadmin에서 경고 메시지를 표시합니다. 분석 표는 나에게 OK의 상태를 제공합니다. 무엇을 추천하나요? – Taff