2011-08-17 3 views
1

중복되는 데이터가있는 테이블을 채우고 싶습니다. 나는 코드에서 이것을 몇 번한다. 그래서, 처음 그은 NOT EXISTS 함수가 UNION보다 훨씬 더 많은 성능을 제공합니까?

INSERT INTO A (SELECT * FROM B) 

된 후, 두 번째는가 재 삽입 총 3 번을 수행

INSERT INTO A 
SELECT * FROM C 
WHERE NOT EXISTS (SELECT * FROM A Where A.field = C.field) 

이다. 4 개의 서브 테이블에서 UNION을 사용하여 코드를 하나의 삽입으로 변경할 수는 있지만 재 설계가 많이 필요하므로 지금 당장에 얼마나 많은 성능 저하가 있는지 알고 싶습니다.

감사합니다.

+0

http : // stackoverflow.com/questions/7077172/if-mysql-db-table-does-not-row-specific-id-add-data-to-the-table/7077314 – nobody

답변

1

노조의 비용이 훨씬 저렴합니다. 그러나 데이터베이스의 평소대로 에 달려 있습니다.

왜?

당신이 바로 지금하고있는 것은이 때문에 : A (하지 존재하는)

  1. 스캔 테이블 B와에 A.으로
  2. 스캔 테이블 C를 삽입하고 삽입합니다.
  3. 표 D를 스캔하고 A에 삽입합니다 (없는 경우).

    1. 스캔 테이블 B.
    2. 스캔 테이블 C.
    3. 스캔 테이블 D.
    4. 삽입 고유 값 테이블 A.
    5. 에 : 노조와

  4. 당신은이 일을 할 것입니다

e 현재 쿼리는 테이블 B, C, D 및 테이블 A를 두 번 더한 오버 헤드와 세 개의 별도 쿼리를 검색합니다. 유니온 쿼리는 테이블 B, C, D를 스캔하고 행을 정렬하여 고유 한 값을 얻은 다음이를 테이블 A에 삽입합니다. 언뜻보기에는 유니언 쿼리가 2 회 더 적게 스캔되므로 단 하나의 인서트 (따라서 덜 잠김).

내가 뜻이을 따라하는 것입니다 :

인덱스 : 올바르게 색인, B, C 및 D의 데이터

양의 데이터를 정렬하는 것보다 더 빠를 수 있습니다 추구 : 당신이 만약 이 토론에서 데이터베이스를 실행하는 하드웨어와 비교할 때 데이터가 거의 없다는 것은 무의미 할 수 있습니다. 나는. 병목 현상이 아닌 부품을 최적화 할 필요가 없습니다.

+0

감사합니다. –

0

대상 테이블에 적합한 UNIQUE KEY 제약 조건이있는 경우에도 INSERT IGNORE ...을 볼 수 있습니다.

성능상의 차이점에 대해서는 잘 모르겠지만 아마도 테이블 구조, 색인 및 데이터에 달려 있습니다. 나는 다른 방법을 벤치마킹하고 가장 적합한 것을 선택한다.

관련 문제