하나의 MySQL 테이블을 다른 값으로 업데이트


93

다른 정보를 기반으로 한 MySQL 테이블을 업데이트하려고합니다.

original테이블은 다음과 같습니다.

id | value
------------
1  | hello
2  | fortune
3  | my
4  | old
5  | friend

그리고 tobeupdated테이블 외모가 좋아 :

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        |    | old
4        |    | friend
5        |    | fortune

나는 업데이트 할 idtobeupdatedid에서 original를 기반으로 value(에 저장된 문자열 VARCHAR(32)필드).

업데이트 된 테이블은 다음과 같을 것입니다.

uniqueid | id | value
---------------------
1        |    | something
2        |    | anything
3        | 4  | old
4        | 5  | friend
5        | 2  | fortune

작동하는 쿼리가 있지만 매우 느립니다.

UPDATE tobeupdated, original
SET tobeupdated.id = original.id
WHERE tobeupdated.value = original.value

이것은 내 CPU를 최대로 사용하고 결국 수행 된 업데이트의 일부만으로 시간 초과로 이어집니다 (일치 할 값이 수천 개 있음). 에 의한 매칭 value이 느릴 것이라는 것을 알고 있지만 이것이 내가 함께 매칭해야하는 유일한 데이터입니다.

이와 같은 값을 업데이트하는 더 좋은 방법이 있습니까? 더 빠를 경우 병합 된 결과에 대한 세 번째 테이블을 만들 수 있습니까?

MySQL 시도 -다른 테이블의 값으로 테이블을 어떻게 업데이트 할 수 있습니까? ,하지만 실제로 도움이되지 않았습니다. 어떤 아이디어?

MySQL 초보자를 도와 주셔서 미리 감사드립니다!


2
'값'열에 색인이 있습니까?
noodl 2011

안녕하세요 noodl; 아니요, value현재 색인이 없습니다.
Superangel

답변:


211
UPDATE tobeupdated
INNER JOIN original ON (tobeupdated.value = original.value)
SET tobeupdated.id = original.id

그것은 그것을해야하며 실제로 당신의 일을 정확히 수행합니다. 그러나 여러 개의 'WHERE'조건보다 조인에 'JOIN'구문을 선호하므로 읽기가 더 쉽다고 생각합니다.

느리게 달리는 경우 테이블은 얼마나 큽니까? tobeupdated.value및에 인덱스가 있어야합니다.original.value

편집 : 쿼리를 단순화 할 수도 있습니다.

UPDATE tobeupdated
INNER JOIN original USING (value)
SET tobeupdated.id = original.id

USING(A)의 약칭이며 모두 표라는 동일가 가입 할 때 key등을 id. 즉 equi-join- http : //en.wikipedia.org/wiki/Join_( SQL)#Equi-join


3
wired00 감사합니다! 이것은 완벽하게 작동합니다. 테이블이 상당히 커서 ( original100,000 개 이상의 항목과 tobeupdated10,000 개 이상) 인덱스에 대한 귀하와 noodl의 조언을 받아 들였고 전체 쿼리가 이제 1 초 이내에 완료됩니다. 나는 그 차이를 믿을 수 없다!? 도움을 주셔서 감사합니다. 많이 배웠어요!
Superangel 2011-04-20

5
들으시 다니 반갑습니다 :) 나도 여기서 많이 배웁니다. 다양한 문제와 아이디어에 노출 될 수
있으므로이

감사합니다 .. 나는 stackoverflow에서 많은 것을 시도했습니다 .. 이것은 마침내 작동했습니다
Jaxx0rr

WHERE를 사용한 간단한 UPDATE가 JOIN 구문보다 훨씬 빠르다는 것을 언급하고 싶었습니다. 약 10.000 행.
Alex2php

1
물론 핵심 요소는 인덱스로 할당하는 것입니다. 타임 아웃 없이는 4 초만에 300K 레코드를 업데이트해야했습니다.
Amjo

0

이러한 테이블의 용도에 따라 다르지만 삽입 및 업데이트시 원본 테이블에 트리거를 두는 것을 고려할 수 있습니다. 삽입 또는 업데이트가 완료되면 원본 테이블의 항목 하나만 기반으로 두 번째 테이블을 업데이트합니다. 더 빠를 것입니다.


감사합니다 firegnom; 전에 트리거를 사용해 본 적이 없지만 반드시 읽어 보겠습니다.
Superangel 2011-04-20
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.