2017-11-19 9 views
1

예를 들어 문제를 설명하기 위해 간단한 예제를 사용하여 주석 페이지를 표시하고 주석이 속한 엔티티의 제목을 표시하려고합니다.MySQL은 비정상적인 쿼리로 네트워크를 통해 동일한 데이터를 전송하지 않습니까?

select title from entities where id = 1 
select column1, column2 from comments where entity = 1 

아니면 (내가 선호하는) 네트워크 호출을 최소화하기 위해 하나 개의 쿼리 수행 할 수 있습니다 :

나는 두 개의 쿼리를 할 수있는 결과 세트는 물론이고 후자의 경우

select title, column1, column2 from entities, comments where id = 1 and entity = id 

을 모든 행은 단 한 번만 필요한 동일한 엔티티 제목을 갖기 때문에 팽창됩니다.

동일한 것을 여러 번 전송하는 것은 낭비입니다. MySQL은이 경우 반환 된 데이터를 최적화하고 네트워크를 통해 제목 데이터를 한 번만 전송하며 (클라이언트에서 결과 집합을 다시 작성)? 또는 네트워크 데이터에 여러 번 반환되는 행만큼 많은 데이터를 넣을 수 있습니까?

+0

. 두 번째 쿼리가 잘못되었습니다 .. 당신은 테이블을 조롱하고 있습니다. –

+0

몇 가지 정보를 선택하는 것 같습니다. 필드 개수가 두 개가 아닌 하나의 쿼리에 대해 상당한 유리한 점이 없다면 – scaisEdge

+0

@scaisEdge 예를 들어 질문을 설명하기 위해 실제 쿼리에서 더 많은 데이터가 – Tom

답변

3

아니요, MySQL은 기본적으로 결과 집합을 최적화하지 않지만 구현할 수는 있습니다 (예 : Ollie는 의견에서 지적합니다). 다양한 네트워크 통신 계층의 일부가 데이터를 압축 할 수도 있지만 이는 드문 것입니다.

귀하의 관찰은 좋은 관찰입니다. 때로는 적은 양의 데이터가 앞뒤로 전달되는 간단한 이유 때문에 여러 쿼리가 더 효율적입니다. 쿼리를 컴파일하고 실행하기위한 오버 헤드가 수 바이트의 데이터를 반환하려는 노력에 비해 크다는 점에 유의하십시오. 따라서 두 쿼리 방법이 눈에 띄게 좋아 지려면 데이터 크기의 차이가 중요해야합니다.

명시 적 사용이 가입
select e.title, c.column1, c.column2 
from entity e join 
    comments c 
    on e.id = c.entity 
where e.id = 1 and entity = id; 

주, 테이블 별칭 및 자격을 갖춘 열 이름 :

두 번째 쿼리가 더 적절으로 기록 될 것입니다.

+2

에 나와있는 것처럼 MySQL은 압축 된 클라이언트/서버 프로토콜을 제공합니다. MySQL 클라이언트는 연결 문자열에서'Compress = true'를 사용하여이를 요청할 수 있습니다. 내 경험상이 ZLIB 압축은 JOIN 작업의 큰 결과 집합에 내재 된 데이터 복제의 트래픽을 다소 완화합니다. –

+0

@ O.Jones. . . 그 정보를 가져 주셔서 감사합니다. 또한 OP가 묻는대로 여러 레코드에서 작동한다는 것도 알아두면 좋습니다. –

+0

일반적으로 zlib는 텍스트 3 : 1을 압축합니다. 그러나 결과 집합의 중복성으로 인해 압축률이 향상 될 수 있습니다. –