2012-07-12 3 views
1

나는 JOIN을 MySQL과 함께 사용하여 기사와 관련된 모든 의견을 선택하고 있지만 기사를 선택하고 기사에 대한 의견이 두 개 이상인 경우 동일한 기사가 여러 개의 의견으로 중복되어 나타납니다. 예를 들어 :
1. id
2 article
다음과 같은 열이있는 테이블 comments :
1. c_id

3
나는 테이블에 다음과 같은 열 articles 있습니다.JOIN은 중복 된 결과를 반환합니다. 걱정할 필요가 있습니까?

: a_id

MySQL의 쿼리는 내가 사용하려고

그리고 이것은 최종 결과입니다

id article c_id body  a_id 
134 Article1 2 Comment1 134 
134 Article1 3 Comment2 134 
134 Article1 8 Comment3 134 

그래서 내 질문은 : 나는 모든 의견에 대해 동일한 article 열의 값을 얻고 있기 때문에, 이는 MySQL의 쿼리 나 어쨌든하여 내 웹 응용 프로그램을 느리게 않습니다 ? 왜냐하면 나는 정말로 필요한 데이터를 더 많이 요구하기 때문이다.
쿼리를 2 개의 간단한 SELECT 쿼리로 분리 할 수 ​​있지만 과장 될 것입니다. 맞습니까?

읽어 주셔서 감사합니다.

편집 : 나는 경우 article 열의 값이 더 큰 무엇
, 1K + 문자가 포함 뭔가, 그것을 복제하기 때문에 할 것인가?

+0

전체로드에 대해 생각해보십시오. 이미 충분히 빠른 속도로 최적화하려고 할 수 있습니다. 이것은 여기에있는 것처럼 보입니다. –

답변

3

모든 의견에 대해 동일한 기사 열의 값을 얻고 있으므로 어쨌든 MySQL 쿼리 또는 웹 응용 프로그램이 느려 집니까? 이후 나는 정말로 필요한 데이터를 더 많이 요구하고 있습니다.

데이터베이스가 필요한 것보다 많은 바이트를 전송하기 때문에 이와 관련된 성능 비용이 있지만 눈에 띄지 않을 수 있습니다.

쿼리를 2 개의 간단한 SELECT 쿼리로 분리 할 수 ​​있지만 과장 될 것입니다. 맞습니까?

측정하지 않고 말하기가 어렵습니다. article의 값이 몇 문자 대신 기가 바이트 인 경우 하나가 아닌 두 개의 선택을 수행하는 것이 좋습니다.

+0

기사 열 값이 더 크면 1k + 문자가 포함 된 값이 복제되므로 복제 할 수 있습니까? – Abdulaziz

+0

그럴 경우 아마 두 가지 질문을하게 될 것이지만 그것은 나의 편견입니다. 중요한지 정확하게 판단하고 싶다면 실제 차이점을 확인하기 위해 테스트 할 수 있습니다. –

2

하나의 쿼리에 표시하려는 모든 기사를 가져온 다음 모든 메모 WHERE comments.a_id IN (1,2,5,6,9,10)에 대해 다른 mysql 호출을 수행 한 다음 응용 프로그램에서 표시중인 기사에 대한 관련 코멘트를 가져올 수 있습니다.

각 기사에 대한 별도의 쿼리에서 의견을받는 것보다 효율적이라고 생각합니다.

+0

실제 고부하 대상 솔루션입니다. 나는 그것을 좋아한다. –

+0

당신의 대답을 오해 할 수도 있지만, 조인을 각 테이블에 대한 별도의 데이터베이스 호출로 변환하는 것은 일반적으로 좋은 조언이 아닙니다. ORM이 그렇게하지 않는 한 최적화가 종종 조인을 강제하는 것입니다. –

+0

+1하지만 모든 페이지에 하나 이상의 문서를 표시하지는 않으므로 웹 응용 프로그램에는 적용되지 않습니다. – Abdulaziz

1

괜찮습니다. 두 개의 쿼리로 나누면 데이터베이스로 두 번 이동해야하며 유사한 쿼리를 두 번 실행해야합니다.더 많은 데이터를 가져 오는 것보다 비용이 많이 드는 대부분의 설정에서 클라이언트가 데이터베이스와 통신하기 위해 사용하는 프로토콜이이를 최적화 할 수 있기를 바랍니다. MySQL은 use compression between client and server 옵션을 가지고 있습니다 - 전송 된 데이터를 최적화해야합니다.

응용 프로그램에 꼭 필요한 경우 벤치 마크하고 가장 잘 맞는 것을 선택해야합니다.

구현이 간단하지 않은 접근 방법 - 전체 응용 프로그램의 perf/load 테스트를 수행하는 경우 병목 현상을 찾아 해결하십시오.

1

일반적으로 다른 쿼리의 데이터베이스에서 더 많은 정보를 얻으려면 돌아 가야 할 필요보다 많은 정보를 선택하는 것이 좋습니다.

이 경우, article 레코드를 너무 많이 잡으면 시스템 속도가 느려지고 있다고 상상할 수 없습니다. 당신이 그것에 대해 걱정하는 경우, select * 것을 사용하는 것이 아니라 명시 적으로 같이 열을 호출하지 않습니다 별도로 두 개의 쿼리를 실행하면

SELECT `comments`.c_id , `comments`.body, `comments`.a_id 
FROM `articles` 
    JOIN `comments` ON `articles`.id = `comments`.a_id 
WHERE `articles`.id = 134 
+0

사실, 이것은 내가 현재하고있는 일이며, 나는 단지 질문에'SELECT *'를 사용했다. – Abdulaziz

+0

나는 본다. 글쎄, 성능 관련 모든 것들을 가지고 테스트해야합니다. –

1

가 확실히 느립니다. 쿼리를 실행하기 전에 "article.id"가 있으면 JOIN을 사용할 필요가 없습니다.

관련 문제