2017-04-12 1 views
0

저는 하위 데이터 표시를 처리하는 가장 효율적이고 효율적인 방법을 찾기 위해 애 쓰고 있습니다. 필자는 PHP와 MySQL을 사용하고 있지만 필자는 이것이 "일반적으로 모든 언어에서"일종의 거래라고 생각합니다.하위 데이터에 대한 루프 내에서 DB 쿼리를 호출하지 않는 방법

내이 생각 만이에 관해서는 주 데이터 (송장)로 하위 데이터 (송장 항목)에 가입

  1. (이 예를 들어 나는 송장과 광고 항목이 나열됩니다)된다 단일 쿼리 내 문제는, 내가 인보이스에 500 개의 광고 항목이 있다고 (현실적인 것은 아니지만 일이 일어난다), MySQL 서버의 전체 인보이스 데이터를 PHP 스크립트에 500 번 보냈을뿐입니다. 한 번만 필요하기 때문에 어리석은 소리가납니다.

  2. 두 번째 옵션은 인보이스를 반복하면서 전체 인보이스 데이터를 표시하면서 인보이스의 광고 항목을 선택하는 것입니다. 그리고 이것은 물론 데이터베이스 500 번에 더 많은 시간을 보냅니다.

(주어진 스키마로) 논리적 인 의미로이 데이터를 처리하는 다른 옵션이 있습니까? 나는 내가이 문제에 대해 생각하는 첫 사람이라고 믿을 수 없기 때문에 거의 100 % 확신 할 수 있지만이 주제에 대한 더 많은 정보를 검색하는 올바른 방법을 찾기가 어려울뿐입니다. . 만에 같은 주요 데이터 (송장)로 하위 데이터 (송장 항목)에 가입

답변

1

는 단일 쿼리이 요구 사항을 처리하는 기존의 방법입니다

있습니다. 실제로 중복 데이터를 처리하기 때문에 약간의 오버 헤드가 있습니다.

하지만.

  1. 클라이언트의 RDBMS에 대한 압축 된 연결을 지정할 수있는 이유는 압축을 통해 중복 데이터의 네트워크 오버 헤드를 완화합니다.
  2. 단일 결과 집합의 중복 데이터 비용은 반복 쿼리보다 훨씬 적습니다.

대부분의 사람들은 이러한 종류의 응용 프로그램에서 중복 데이터를 검색합니다. Crystal Reports와 같은 프로그램 제품에서이 작업을 수행합니다.

그냥 작동하지 않으면 마스터 레코드에 대한 결과 집합 하나를 검색하여 저장하면됩니다.

SELECT master_id, name, address, whatever 
    FROM master m 
    WHERE m.whatever = whatever 
    ORDER BY whatever 

그런 다음 연관 배열에 master_id을 입력하십시오.

그런 다음 세부 레코드를 검색하십시오.

SELECT d.master_id, d.detail_id, d.item, d.unit, d.quantity 
    FROM detail d 
    JOIN master m ON d.master_id = m.master_id 
    WHERE m.whatever = whatever 
    ORDER BY d.master_id, d.detail_id, whatever 

당신은 master_id 값 태그 모든 관련 상세 기록 (송장 항목)를 설정 한 결과를 얻을 수 있습니다. PHP 프로그램에서 마스터 레코드와 일치시킬 수 있습니다. 기본적으로 응용 프로그램 코드에서 조인을 수행하고 있습니다.

목에 통증이 너무 많이 들리는 경우 ... 중복 된 데이터로 이동하여 프로젝트를 완료하십시오.언제든지 나중에 최적화 할 수 있습니다.

+0

오 와우, 나는 PHP에 함께 참여할 생각이 없었습니다. 내 실제 데이터로 벤치 마크를 설정하고 3 가지 방법 중 어느 것이 승리하는지 살펴 보겠습니다. 데이터 크기를 줄이는 압축도 고려하지 않았습니다. –

+0

세 가지 방법으로 무거운 테스트를 한 후 두 가지 쿼리를 실행 한 후 PHP에 합류했습니다. 한 번은 상위 데이터를, 두 번은 모든 하위 데이터를 테스트했습니다. (적어도 내 경우에는) 성능 측면에서 다른 두 가지를 뭉개 버렸다. 각 부모 행에 대한 하위 데이터 호출은 분명히 손실되어 크기가 조정되지 않았으며, 제 상황에서는 쿼리가 모든 추가 조인으로 인덱싱하기가 매우 어려워서 쿼리가 범인이되었습니다. –

+0

쿼리가 최적화 될 수있는 것처럼 보이지만 반환 할 데이터가 많은 경우 중복 데이터 옵션이 가장 빠를 수도 있습니다. –

관련 문제