2011-08-23 2 views
-1

지금 아래의 쿼리는 각 결과에 대해 1 행을 반환합니다. 각 행에 대한 태그 목록을 표시해야하며이 쿼리를 변경하여 INNER가 태그에 가입하고 데이터를 파싱하도록 토론하고 있습니다. PHP 끝, 또는 각 반환 결과에 대해 별도의 쿼리를 실행해야한다면 ....이 것에 대한 생각은 무엇입니까? 추가 데이터를 가져와 PHP 끝에서 구문 분석하거나 추가 쿼리 (어쩌면 25-30)를 실행해야합니까?검색 중 ... 하나의 큰 쿼리 또는 중간 및 많은 작은 쿼리?

  SELECT 
       content.id, 
       content_text.content 
      FROM content 
      INNER JOIN content_text ON (
       content_text.content_id = content.id AND 
       content_text.language_id = 1 
      ) 
      INNER JOIN tags_to_content ON (
       tags_to_content.tag_id IN (1) 
      ) 
+2

하나는 알 수 없습니다. 실행중인 구체적인 시스템에서 둘 다 측정해야합니다. – hakre

+1

24-29 개의 쿼리가 심각한 오버 헤드처럼 들립니다. 두 접근법을 측정하는 것은 어떻습니까? – Jacob

+1

각 쿼리에 대해 최악의 경우 (연결 풀링이 있음에도 불구하고) 별도의 연결을 가정하고 권한 부여 검사와 함께 파서 엔진을 실행하고 인덱스를 한 번 또는 여러 번 실행해야합니다. 또한 많은 작은 응답에는 반드시 네트워크 계층에 더 많은 "절반 만"의 데이터 그램이 있어야합니다. 한 가지 큰 쿼리가 너무 커서 서버가 메모리 문제를 일으키지 않는 한 많은 작은 쿼리가 아닌 하나 또는 여러 개의 큰 쿼리를 갖는 것이 항상 유리합니다. – Damon

답변

1

mysql : GROUP_CONCAT()에서 많이 사용되지 않는 작은 명령에 의존 할 수 있습니다.

SELECT 
    p.title as title, 
    p.content as content, 
    GROUP_CONCAT(c.name order by c.name SEPARATOR ', ') as categories 
FROM 
    post as p 
INNER JOIN 
    post_category as pc 
ON 
    p.id = pc.post_id 
INNER JOIN 
    category as c 
ON 
    pc.category_id = c.id 
GROUP BY 
    p.id 

어느 것 : 여기

Official Doc for GROUP_CONCAT

(나는 블로그에 적용 할 수있는 구체적인, 자사의 예를 알 수 없기 때문에 현재의 문제에 기반하지 않음) 작은 예입니다 return

+------------------+--------------------+------------------------------------+ 
| title   | content   | categories       | 
+------------------+--------------------+------------------------------------+ 
| Some title  | Some content  | category 1, category 2, category 3 | 
| Some other title | Some other content | category 1, category 3, category 4 | 
... 
+------------------+--------------------+------------------------------------+ 
+0

훌륭해, 완벽하게 작동합니다, 감사합니다 !!! – Webnet

0

나는 전체 행 수와 조인 된 테이블의 레코드 수를 비교하기 위해 항상 결과 수를 교환합니다.

"students"테이블에 1000 개의 레코드가 있고 모든 학생이 3 개의 카테고리 (categorie_id가 왼쪽에있는 가입 카테고리에 포함됨)에 속한다고 가정 해 봅시다. 학생을 반복하고 결합 된 데이터를 가져옵니다 (+ 캐시). 표 (카테고리).

1000 명의 학생과 1500 명의 학부모 (부모님의 parent_id)가 있고 질문에 대한 결과 (예 : "이 도시 밖에있는 학생")가 모든 학생을 돌려 주면 조인 테이블로 이동합니다. 학생들의 10 % 만 돌려 주길 기대한다면 (예를 들어 "도시 바깥의 학생들"), 첫 번째 예제와 같은 작은 쿼리를 다시 보겠습니다.

의심 스럽다면 예제 쿼리를 실행하고 타이머를 넣으십시오 ...?

관련 문제