2010-12-16 10 views
0

나는 내 인생이 알아낼 수없는 것 : X여러 하위 쿼리의 GROUP_CONCAT?

나는 두 개의 테이블이 ..

  • 1 = 태그는
  • 2 = 태그 데이터
링크

프로필을 쿼리 할 때 각 프로필은 태그 링크 테이블에 여러 항목을 가질 수 있습니다. 일단 태그 링크를 검색하면 태그 데이터 테이블에서 태그 텍스트를 가져 오려고합니다. 그 해결책이 정확히되지 않도록이 사용자에게 할당되어있는 경우 각 쿼리는 5 소요로 다음 검사를 SELECT * FROM platform.tagWords WHERE tagId IN (SELECT tagId FROM platform.user sProfilesTags WHERE userId = 1001)

을하지만 (50,000 주위) 각 태그를 통과하고 :

나는이 작업을 수행 할 수 있습니다 8 초.

되돌릴 방법이 있습니까?

모든 조언이나 조언을 부탁드립니다.

미리 감사드립니다.

* 업데이트는 그래서 나는이에게 참여와 찌르기를 제공하기 위해 노력하고있어,하지만 난 너무 거기에 붙어 : P

SELECT                   

    GROUP_CONCAT(tagWords.tagWord SEPARATOR ', ') AS tags,       
    usersProfiles.*                 

FROM platform.users u               

INNER JOIN platform.usersProfilesTags ON usersProfilesTags.userId = u.userId 
INNER JOIN platform.usersProfiles ON usersProfiles.userId = u.userId   
INNER JOIN platform.tagWords ON tagWords.tagId = usersProfilesTags.tagId  

WHERE u.userName = 'mattstest' 
+0

프로필을 언급하고 있지만 태그 데이터는 테이블입니까? –

+0

예, 다른 (원본 테이블)은 usersProfiles입니다. 여기서 userId를 통해 태그 링크 테이블에서 링크 된 태그를 찾습니다. –

+0

테이블 스키마 (테이블에 대한'CREATE' 문)는 무엇입니까? join statement의 결과는 여러분이 원하는 것이 아닙니다. – outis

답변

-1

첫 번째 쿼리가 잘 보인다. 5-8 초 정도 걸리면 usersProfilesTags(userId)에 색인이 누락되었을 수 있습니다.

하나의 쿼리에서이 작업을 시도하는 것은 프로필을 가져 오는 쿼리와 태그를 가져 오기위한 다른 쿼리라는 두 가지 별도의 쿼리를 수행하는 것보다 어렵고 느릴 수 있습니다. 일반적으로 MySQL은 하나의 복잡한 쿼리가 아닌 여러 개의 간단한 쿼리를 실행할 때 가장 잘 작동합니다. 하위 쿼리는 상대적으로 최근 기능이며 종종 성능이 좋지 않습니다.

GROUP_CONCAT() 쿼리에 대해 GROUP BY이 누락되었습니다. userProfiles의 모든 열을 GROUP BY 목록에 나열해야합니다.

+3

이것은 나쁜 조언입니다. 쿼리를 여러 개의 작은 쿼리로 나누지 마십시오. 반대의 작업을 수행하십시오. 서브 쿼리 지원은 8 년 전에 추가되었으며 본래의 성능 문제는 없습니다. 더 많은 쿼리를 실행할수록 연결 및 통신 오버 헤드가 증가할수록 더 많은 디스크 IO가 낭비되고 쿼리가 결합되면 불필요한 행을 검색 할 수있게되고 더 많은 메모리가 버퍼링 결과를 낭비하게됩니다. 내 던지다. –

+0

MySQL이 부질의 결과에 대한 임시 테이블 (인덱스없이)을 생성하는 경우가 많았습니다. 그 결과 느린 중첩 루프 조인이됩니다. 다른 경우에는 외부 쿼리를 내부 쿼리와 잘못 병합하고 외부 쿼리의 모든 행에 대해 내부 쿼리를 실행합니다. MySQL 매뉴얼 섹션 "하위 쿼리 최적화"를 읽고 옵티마이 저가 서브 쿼리를 위해 얼마나 제한되어 있는지 알아보십시오. –

+0

내가 가지고있는 것 같아 :) SELECT GROUP_CONCAT (tags.tagWord SEPARATOR ',') FROM (SELECT u.* tagWords.tagWord = 1001 userId를이) 태그 –