2012-07-01 2 views
0

이 작업을 수행하는 적절한 방법이 확실하지 않습니다. 나는 기본적으로 2 개의 테이블을 가지고있다. 두 표 모두 동일한 구조를가집니다. Database1 (현재 데이터 평균 20k 행), Database2 (데이터 누적은 한 번에 1mil 행을 넘을 수 있음)mySQL - 테이블 행 비교

두 테이블을 비교하고 특정 timestamp 쿼리를 사용하여 Database2에 존재하지 않는 Database1의 결과를 얻고 싶습니다. 내가 가지고 있고 아직 시도한 쿼리는 검색하는 데 너무 오래 걸립니다.

는 시도 : 난 아직도 내 머리는이 감싸 얻을 수 없습니다

select distinct player from Database1 
where not exists (select player from Database2 where snap = 1340981695) 

SELECT Database1.player FROM Database1 
INNER JOIN Database2 ON Database1.player NOT IN (Database2.player) AND Database2.snap = 1340981695 
GROUP BY Database1.player 

select distinct Database1.player from Database1 
left join Database2 on Database1.player not in (Database2.player) 
and Database2.snap = 1340981695 

. 도움을 주셔서 감사합니다.

+0

표 구조 및 색인을 표시하십시오 – Cfreak

+0

두 테이블 모두 id, player, castle, xaxis, yaxis, snap 및 id가 기본 키입니다. 새로운 데이터가 생성되어 Database1에 저장 될 때 항상 동일한 데이터는 없으며 항상 변경됩니다 (Database1에서 복사되고 Database2로 복사되고 항상 누적됩니다). – sgkdnay

+0

인덱스를 배치하는 것이 실제로는 없습니다. 'player'와'snap'에'id'가 합치는 것 같이 도움이 될 것입니다 (테이블에서 일치한다고 가정 할 때). 모든 데이터 플랫 파일을 덤프하고 차이점을 찾기 위해 그것을 분석하는 프로그램을 작성하는 것이 좋습니다. grep은 아마도 이것을 매우 빠르게 수행 할 것입니다.) 일단 그렇게하면 데이터베이스 설계를 재고해야합니다 .MySQL은 1M + 행 테이블에서 정상적으로 작동합니다. 왜 2? – Cfreak

답변

2

세 가지 접근 방식이 있습니다. 최고에서 최악으로 performance의 대략적인 순서에서 :

  1. 를 사용하여 외부 조인 :

    SELECT Database1.* 
    FROM Database1 
        LEFT JOIN Database2 
         ON Database1.id = Database2.id AND Database2.snap = 1340981695 
    WHERE Database2.id IS NULL 
    
  2. 사용 IN :

    SELECT * 
    FROM Database1 
    WHERE id NOT IN (SELECT id FROM Database2 WHERE snap = 1340981695) 
    
  3. 사용 EXISTS :

    SELECT * 
    FROM Database1 
    WHERE NOT EXISTS (
         SELECT * 
         FROM Database2 
         WHERE id = Database1.id AND snap = 1340981695 
         ) 
    
+0

중첩 된 쿼리는 생각할 최악입니다. 나는 그 누구도 어떤 경우라도 그들에게서 어떤 성과를 얻을 수 있다고 생각하지 않는다. 그들을 사용하지 않는 것이 좋습니다. –

+1

내가 링크 된 @ Quassnoi의 블로그 기사를 읽으라고 제안합니다. 위의 두 번째 방법은 외부 조인과 비슷한 성능을 제공합니다. – eggyal

+0

해당 기사에서는 특정 열의 인덱스와 같은 몇 가지 특별한 경우를 가정합니다. 내가 제안한 바는 사람들이 쉽게 네임드 쿼리를 작성하지 않고 쉽게 작성할 수 있도록하는 것이 일반적으로 바람직하지 않다는 것이다. –