2012-04-06 3 views
2

나는이 작업을 수행했음을 확신하지만, 30 분 동안 일반 노트북의 MySQL 데이터베이스에서 쿼리를 실행했습니다. "트윗"테이블은 단지 백만 기록 만 있습니다.하나의 테이블에서 다른 테이블로 텍스트 삽입

뭘 원합니까? 고려 테이블 "AAA"(왼쪽)와 "BBB"(오른쪽) 나는 테이블 B에서 텍스트와 테이블 A의 "텍스트"열 채우려

id_str text id_str text 
------------ ------------------- 
13    13  foo bar baz 
14    14  foobar 
       13  foo bar baz 
       17  foobaz 

: 그래서

UPDATE AAA 
SET `text` = (
    SELECT `text` AS `text` 
    FROM BBB 
    WHERE id_str = AAA.id_str 
    LIMIT 1 
) 

을 테이블 AAA는 다음과 같이 보입니다.

그러나이 쿼리는 너무 오래 실행됩니다. 구문에서 실수를 했습니까? 내가 제대로 상황을 이해한다면

+0

삽입하는 값으로'text'를 사용하여'text'를 값으로 선택하는 것일 수도 있습니다. – Grigor

+1

'AAA'는'BBB'에서 일치하지 않는 행을 포함 할 수 있습니까? 그렇다면, 그 행에있는'''text'' 값이 비어 있는지 확인하고 싶습니까? –

+0

AAA에 BBB에 일치하는 str_id가 포함되어있을 수 없습니다. 반대로 - 예제에서 보듯이 BBB는 동일한 str_id를 가진 중복 레코드 세트를 포함 할 수 있습니다. – Pr0no

답변

1

,이 훨씬 더 빨리해야한다 : 당신은 한 번만이 쿼리를 실행해야한다

UPDATE `AAA`,`BBB` SET `AAA`.`text`=`BBB`.`text` 
WHERE `AAA`.`id_str`=`BBB`.`id_str` 

. 여전히 몇 분이 걸릴 수 있지만 JOIN을 사용하여이 방법을 사용하면 100 만 개의 별도 쿼리를 실행하는 것보다 훨씬 빠를 것입니다.

AAA. id_strBBBid_str은 모두 동일한 데이터 유형 (예 : 둘 다 int이어야합니다 (11). 이를 통해 MySQL은 최대 효율성으로 MySQL 간의 동등한 관계를 평가할 수 있습니다.

편집 : 앞에서 설명한 쿼리는 시스템 구성과 하드웨어에 따라 약간의 시간이 걸릴 수 있습니다 (작업은 디스크 바인딩, 즉 하드 디스크의 속도에 따라 제한 될 수 있음). MySQL이 테이블 AAA에서 인덱스를 업데이트해야하기 때문일 수도 있습니다 - 테이블 AAA에 대해 CREATE TABLE 성명을 표시 할 수 있습니까? 또는이를 시도 할 수 :

CREATE TABLE `CCC` LIKE `AAA`; 
INSERT INTO `CCC` SELECT `AAA`.`str_id`,`BBB`.`text` FROM `AAA` JOIN `BBB` ON `AAA`.`id` = `BBB`.`id`; 

이 이전 테이블 AAA에서 모든 데이터를 복사하지 않습니다,하지만.

+0

지금이 쿼리를 실행 중입니다. 팁을 고려했지만 지금은 아직 약 15 분 정도 걸립니다. 문제는 동일한 id_str에 대해 BBB에 중복 항목이있을 수 있습니까 (게시물 열기의 예제 참조)? – Pr0no

+1

문제가되지 않아야합니다 ... 제가 방금 답변 한 내용의 성능은 어떻습니까? – Daan

+0

나의 나쁜 - 나는 너무 빨리 말했다. AAA.str_id에 인덱스를 넣는 것을 잊어 버렸습니다. 내가 한 후에 쿼리는 20 초 만에 완료되었습니다! 감사합니다 :-) – Pr0no

1
UPDATE AAA, BBB 
SET AAA.`text` = BBB.text 
WHERE BBB.id_str = AAA.id_str 
관련 문제