2016-07-27 2 views
0

테이블 "비즈니스"에 300,000 개의 레코드가 있고 테이블 "민트"에 50,000 개의 레코드가 있으며 둘 다 정리 된 "phoneno"열이 있습니다 (모두 동일한 형식이므로 모두 사용할 수 있습니다). 일치하는 내 방식이 될)mysql의 한 테이블에서 다른 테이블로 가져 오기

메신저를 삽입하기 전에 이들이 비즈니스 테이블에 있는지 확인하려고하기 때문에 민트 테이블에 다른 열을 만들고 아래 쿼리를 실행합니다. 그 아이디어는 모든 null 값을 "비즈니스"에 삽입하는 것입니다.

update mint t9 
inner join businesses b 
    on b.Telephone = t9.phoneno 
set t9.bid = b.businessID 

문제는 내가 일치해야하는 몇 가지가있다 알면서도, 쿼리가 바로 나에게 어떤 결과를 제공 결코 그것을 timesout 때까지 영원히 실행하지 않고있다. 나는 분명히 잘못된 것을하고 있습니까? -------------------------------------- 편집 ---------- --------------------- 관련이있는 테이블에

열은 : --- businesses-- BusinessID

| 전화

--- 민트 --- phoneno | 입찰

mint의 입찰가는 내가 추가 한 null 열입니다. 아이디어가 나중에 비즈니스 테이블에있는 경우 삽입하여 나중에 존재하지 않는 레코드를 삽입하는 쿼리를 실행할 수있었습니다.

기본적으로 민트 테이블의 전화 번호가 사업장에 있는지 먼저 확인하려고합니다. 삽입하기 전에 업체 정보를 업데이트해야합니다. 그렇지 않으면 업데이트하고 싶습니다.

+0

'mint' 및'businesses' 테이블 정의와 결과를 기대하는 샘플을 공유 할 수 있습니까? –

+0

@JonathonOgden 죄송합니다. 편집을 마쳤습니다. –

+0

_keys_ 또는 _indices_ (색인)과 관련있는 이러한 열은 전혀 없습니까? –

답변

0

몇 가지 방법이 있습니다.

세그먼트 : 시간 초과로 인해 이것이 일반적이므로 세그먼트 단위로 업데이트하십시오. 나는 종종 이것을

update mint t9 
inner join businesses b 
on b.Telephone = t9.phoneno 
set t9.bid = b.businessID 
where t9.id between 1 and 50000; 

update mint t9 
inner join businesses b 
on b.Telephone = t9.phoneno 
set t9.bid = b.businessID 
where t9.id between 50001 and 100000; 

등으로 생각할 것입니다. InnoDB가 이것을 암묵적인 트랜잭션으로 로깅하고 타임 아웃이 발생하는 이유. 나는 수천만 개의 행에 반대 할 때이 문제가있다.

또는

IODKU : 사용 INSERT ... ON DUPLICATE KEY UPDATE. 내 예제 here 중 하나를 참조하십시오.

또는 INSERT IGNORE ...

Insert ignore

사용은 확실히 그 일의 서부 방법입니다하지만 당신은 그것의 사용에주의하고 당신이 경험하는 경우, 그것은 중대하다. 키 충돌이 발생하면 전체 행을 건너 뜁니다. 참고로, 이것은 유스 케이스가 아닐 수도 있습니다.

관련 문제