2013-02-28 4 views
0

나는 3 개 테이블 a b c AB와 C 모두가 ID를 통해 관련이 내 작업이 a.date 나이가 6 개월 이상 모든 AB의 행과 C를 선택하고 새에 삽입하는 것입니다 a.id = b.id = c.idMySQL의 선택 여러 레코드

보관을위한 db.

insert into dbArchive.a select * from db.a where receivedDate < CURRENT_DATE() - INTERVAL 6 MONTH;` 

이 테이블의 모든 항목을 선택할 것으로 보인다 나이가 6 개월 이상이며, 아카이브 DB를 표 A에 삽입하는 : 여기

는 내가 지금까지 가지고있는 것입니다.

동일한 ID를 가진 테이블 b와 c의 모든 행을 찾아 아카이브 db 테이블 b 및 c에 삽입하는 가장 효과적이고 효율적인 방법은 무엇입니까?

6 개월 이상 된 레코드가 1 백만 개를 넘었으므로 성능 문제에 지쳐있었습니다.

답변

0

그래서 잠시 동안 재생 후이 실제로 작동하는 것을 발견 한 가장 좋은 방법이 될 것 같다 :

INSERT INTO archive.b SELECT * FROM db.b WHERE `id` IN(SELECT `id` FROM archive.a) 

나는 이것이 가장 효율적인 방법입니다 확실하지 오전하지만를 가져옵니다 job done

+0

예. 이 작동합니다. 나는 조금 지나치게 생각했다. 그것은'SELECT','JOIN', 효율성을 찾기 위해 내부 쿼리가 어떻게 작동 하는지를 알아야합니다. 여기서는 'JOIN'이 사용되지 않으므로이 방법이 더 효율적이라고 생각합니다. 시간이 있다면, 둘 다 테스트 해보고 알려주십시오. – chandimak

0

여기에 입력 한대로 dbArchive.a에 삽입 한 후 다음을 실행하여 dbArchive.b에 삽입하고 dbArchive.c과 같은 방법으로 삽입 할 수 있습니다.

INSERT INTO dbArchive.b(id, etc..) 
    SELECT db.b.id, etc.. 
    FROM dbArchive.a INNER JOIN db.b ON dbArchive.a.id = db.b.id; 
+0

Ok ... 나는 'SELECT' 대'VALUES (....)'를 사용하여 모든 것을 복사하고 열을 지정하는 것을 복사 할 수 있습니까? 나는 테이블을 결합 할 때나 선택과 결합 된 삽입을 할 때 항상 혼란스러워한다. –

+0

수정 된 답변 확인. 그것은 몇 가지 실수를했습니다. 예, 열이 값과 일치 할 수 있습니다. 여기서 모든 열에 값을 전달하면'INSERT INTO'에서 열 이름을 생략 할 수 있지만'dbArchive.a'와'db.b' 둘 다에서 값을 사용할 수 있으므로'SELECT' 열을 지정해야합니다. – chandimak

+0

나는 이것을 조금 가지고 놀았습니다. 그것은 꽤 효과적이지는 않지만 닫힙니다. 나는 다음을 가지고있다 :'SELECT rdo.qs_mailContent.id, rdo.qs_mailContent.bodyText, rdo.qs_mailContent.bodyHTML, rdo.qs_mailContent.headers FROM qs_mailArchive.qs_mail INNER JOIN rdo.qs_mailContent ON qs_mailArchive.qs_mail.id = rdo.qs_mailContent. ID LIMIT 10' 다음 ID로 결과를 반환합니다 :'2 5 7 118 ....'이 문장을 다음과 같이 변경하면 :'SELECT * FROM qs_mailArchive.qs_mail INNER JOIN rdo.qs_mailContent ON qs_mailArchive.qs_mail.id = rdo.qs_mailContent.id limit 10' .... –