두 개의 MySQL 쿼리를 노조 또는 프로그래밍 방식으로 통합하십시오

StackOverflow https://stackoverflow.com/questions/867922

  •  22-08-2019
  •  | 
  •  

문제

데이터를 테이블에 삽입하는 두 개의 MySQL 쿼리가 있습니다. 둘 다 다음 형식을 가지고 있습니다.

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

두 쿼리의 유일한 차이점은 How입니다 field1 그리고 field2 조건 절에서 결정되며 약간의 차이가 있습니다. 둘 다 최대 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_ONE 그리고 DO_TWO 일부 사양에 따라 필드 데이터를 변경하는 사용자 정의 MySQL 기능입니다.

도움이 되었습니까?

해결책

Aaronmccall의 답변은 아마도 일반적으로 최고 일 것입니다. Union 접근 방식은 하나의 SQL 호출로 모든 작업을 수행합니다. 일반적으로 가장 "효율적"이지만 특정 응용 프로그램에 대한 "효율적인"측정에 영향을 줄 수있는 부수적 인 문제가있을 수 있습니다.

구체적으로, 노조가 중간 결과를 수집하기 위해 임시 테이블을 요구하고 매우 큰 데이터 세트로 작업하는 경우 새 테이블에 두 개의 별도 직선 선택을 수행하는 것이 특정 경우에 더 효율적일 수 있습니다. 이는 데이터베이스 엔진 내의 내부 작업, 최적화 등에 따라 다릅니다 (사용중인 데이터베이스 엔진 버전에 따라 변경 될 수 있음).

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

또한 두 개의 개별 쿼리에 필요한 시간과 "하나의 하나의"쿼리에 필요한 시간의 차이는 그랜드 사물의 계획에서 중요하지 않을 수 있음을 고려할 수도 있습니다 ... 아마도 몇 밀리 초의 차이에 대해 이야기하고있을 것입니다 (또는 MySQL 데이터베이스가 거대한 대기 시간 문제가있는 별도의 서버에 있지 않는 한 마이크로 초. 한 번의 샷으로 수천 개의 전화를하는 경우 차이가 중요 할 수 있지만,이 전화 중 하나 또는 두 개만 수행하고 응용 프로그램이 다른 것을 실행하는 데 99.99%의 시간을 소비하는 경우 두 사람은 아마도 눈치 채지 못할 것입니다.

--- 로렌스

다른 팁

PHP와 하나의 두 개의 MySQL API 호출을 비용으로 인해 유니온 접근 방식이 확실히 빠르야합니다.

당신의 옵션은 다른 일을합니다. 첫 번째 쿼리가 올바르게 실행되면 두 번째 쿼리의 결과를 반환합니다 (이는 반환 된 결과와 독립적으로 BTW입니다. 빈 행 세트를 반환 할 수 있습니다). 두 번째는 첫 번째 쿼리와 두 번째 쿼리의 결과를 함께 반환합니다. 첫 번째 옵션은 나에게 꽤 쓸모없는 것 같습니다.

편집 : 귀하의 의견을 읽은 후, 나는 당신이 다음과 같은 것을 따르고 있다고 생각합니다.

true를 선택하십시오 (Exists (select field1, field2 ...)가 존재하고 존재합니다 (Select Field1, Field2 ...).

이렇게하면 DB에 대한 쿼리가 하나만 있으면 더 나은 쿼리가 더 좋으며 연결 풀에서 리소스가 적고 다른 서버에 DB 엔진이있는 경우 대기 시간의 영향을 두 배로 늘리지 않지만 여전히 쿼리를 방해합니다. 첫 번째 조건이 실패하면 중첩 된 분리 된 쿼리를 찾는 곳에서 성능 향상입니다.

최적화로서, 동일하지 않은 경우 더 빨리 실행되는 조건을 먼저 사용하십시오. 그들 중 하나가 필드 계산이 느려질 것이라고 가정합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top