2009-05-15 5 views
1

두 테이블 모두에 데이터를 삽입하는 두 가지 MySQL 쿼리가 있습니다. 두 쿼리 간의두 개의 MySQL 쿼리를 UNION 또는 프로그래밍 방식으로 결합하십시오.

CREATE TABLE IF NOT EXISTS `data` (
`id` BIGINT NOT NULL AUTO_INCREMENT UNIQUE, 
PRIMARY KEY (`id`) 
) 
SELECT `field1`, `field2` 
WHERE `active` = 1 

유일한 차이는 field1field2이 어떻게 결정되는지, 그리고 조건 절에 약간의 차이 : 모두 다음과 같은 형식을 가지고있다. 둘 다 최대 12K와 더 많은 기록을 실행합니다.

A. 실행 별도로 두 쿼리 :

if (mysql_query($query1)) { 
    return mysql_query($query2); 
} 
return false; 

B. 또는 노동 조합과 함께 두 개의 쿼리를 결합, 한 번 실행

$query = 'SELECT `field1`, `field2` WHERE `active` = 1 
      UNION 
      SELECT DO_ONE(`field1`), DO_TWO(`field2`) WHERE `active` = 1 
      ORDER BY `field1`'; 
return mysql_query('CREATE TABLE IF NOT EXISTS `data` (
`id` BIGINT NOT NULL AUTO_INCREMENT UNIQUE, 
PRIMARY KEY (`id`) 
) ' . $query) 
더 효율적 무슨 지금

,

한 쿼리의 데이터는 다른 데이터의 데이터가 없으면 쓸모가 없으므로 둘 다 성공해야합니다. DO_ONEDO_TWO은 일부 사양에 따라 필드 데이터를 변경하는 사용자 정의 MySQL 함수입니다.

+0

은 적어도 표면적으로, 당신의 목표 테이블이 이미 존재하는 경우 쿼리의 이전 실행에서 당신이 얻을 것이다 것처럼 왼쪽 오버 찌꺼기를 보인다. 또한 자동 생성 된 기본 키가 있기 때문에 원하는만큼 테이블에 새 레코드를 계속 삽입 할 수 있습니다 (번호가 다 떨어지기 전에 디스크 공간이 부족할 것 같음). –

+1

UNION 버전에서는 결과 집합에 중복 레코드가 없도록합니다. 별도의 쿼리 버전은 그렇지 않습니다. 음, 'id'열은 실제로 레코드가 모두 구별되지만 다른 열 (그러나 다른 id 값)에는 같은 데이터를 가진 반복 된 레코드가있을 수 있습니다. 아마도 UNION을 사용하는 것이 중요합니다. –

답변

1

아마도 Aaronmccall의 답변이 일반적으로 가장 좋습니다. UNION 접근 방식은 모든 SQL 호출에서이 모든 것을 수행합니다. 일반적으로 이것이 가장 "효율적인"것이지만, 특정 애플리케이션에 "효율적인"측정에 영향을 미칠 수있는 부작용이있을 수 있습니다.

특히, UNION이 중간 결과를 수집하기 위해 임시 테이블을 필요로하고 매우 큰 데이터 세트로 작업하는 경우 새 테이블로 두 개의 분리 된 직선 SELECT를 수행하면 특별한 경우에 더 효율적이 될 수 있습니다. 이것은 데이터베이스 엔진 내에서 수행되는 내부 작업, 최적화 등 (사용중인 데이터베이스 엔진의 버전에 따라 변경 될 수 있음)에 따라 다릅니다.

궁극적으로 이와 같은 특정 질문에 대한 질문에 대답하는 유일한 방법은 특정 응용 프로그램 및 환경에 대한 타이밍을 수행하는 것일 수 있습니다.

"일대일"쿼리 대 두 개의 별도 쿼리에 필요한 시간의 차이는 사물의 웅장한 구성에서 중요하지 않을 수도 있습니다 ... 아마도 당신은 mysql 데이터베이스가 거대한 대기 시간 문제가있는 별도의 서버에 있지 않는 한 몇 밀리 초 (또는 심지어 마이크로 초?). 한 번에 수천 회의 이러한 호출을 수행하는 경우 차이가 상당 할 수 있지만 이러한 호출 중 하나 또는 두 개만 수행하고 응용 프로그램이 다른 작업을 실행하는 데 소요되는 시간의 99.99 %를 소비하는 경우에는 아마도 두 사람도 눈치 채지 못할 것입니다.

--- 로렌스

+0

쿼리 중 하나가 밀리 초 단위로 실행됩니다. 다른 하나는 복잡한 storec 절차 때문에 분이 소요됩니다. 나는 쿼리를 최적화하기 위해 저장된 proc에서 벗어나기로 결정했다. – Jrgns

0

옵션에 따라 옵션이 달라집니다. 첫 번째 쿼리가 올바르게 실행되면 두 번째 쿼리의 결과를 반환합니다.이 쿼리는 반환하는 결과와 별개로 BTW이며 빈 행 집합을 반환 할 수 있습니다. 두 번째 쿼리는 첫 번째 쿼리와 두 번째 쿼리의 결과를 함께 반환합니다. 첫 번째 옵션은 제게는 쓸데없는 것 같습니다. 아마도 당신이 원하는 것은 UNION으로했던 것입니다 (내가 잘못 이해하지 않았다면).

편집 : 귀하의 코멘트를 읽은 후, 나는이 같은 후 생각 : (... FIELD2, (필드 1을 선택 EXISTS) AND (필드 1을 선택 존재 FIELD2 ...))

경우 True를 선택 .

DB 서버에 쿼리를 하나씩 더 잘 저장하고 연결 풀에서 리소스를 덜 차지하며 DB 엔진을 다른 서버에두면 대기 시간의 영향을 두 배로 늘리지는 못하게됩니다. 첫 번째 조건이 실패하면 여전히 쿼리를 중단합니다. 이는 중첩 된 분리 쿼리를 사용하여 찾고자하는 성능 향상입니다.

최적화로, 먼저 같지 않은 경우 더 빠르게 실행할 조건을 갖도록하십시오. 나는 그들 중 하나가 그 필드 계산을 요구한다면 더 느릴 것이라고 생각한다.

+0

어느 옵션도 결과 집합을 반환하지 않습니다. querie 중 하나 또는 모두가 실패하거나 결과 객체가 실패하면 둘 다 false를 반환합니다. 이러한 쿼리는 데이터 만 삽입하기 때문에 결과 개체를 쿼리 할 필요가 없습니다. 삽입이 성공적으로 수행되었는지 확인하기 위해 부울로만 해석됩니다. – Jrgns

+0

당신은 노조의 경우 첫 번째가 비어있는 경우 두 번째는 당신이하는 쿼리 때문에 비어있는 것을 반환 할 것이라는 의미입니다. UNION이 수행 할 작업은 각 쿼리의 결과를 합친 것입니다. 즉, 레코드를 반환하면 TRUE를 얻고 다른 하나는 반환하지 않습니다. 어쨌든, 나는 당신이 조금 더 나은 것을 알기 때문에 내 대답을 편집 할 것입니다. – palako

0

UNION 접근법은 php 대 one에서 두 개의 mysql api 호출을 작성해야하므로 더 빠를 것입니다.

관련 문제