2016-09-14 2 views
4

코드가있는 열이 있습니다. 이제 각 코드가 다른 것으로 변경되었습니다. 나는 그것을 업데이트하려고 노력하고있다. 그래서 나는 mysql에서 case 문을 사용했다. 그러나 문제는 대체해야 할 250,000 행과 80,000 개의 고유 코드가 있다는 것입니다. case 문은 10 분 정도 걸립니다. 더 나은 접근 방법입니다.case 문으로 쿼리 최적화

내 쿼리는 다음과 같습니다

UPDATE test_table 
SET code = CASE 
WHEN code = "akdsfj" THEN "kadjsf" 
WHEN code = "asdf" THEN "ndgs" 
WHEN code = "hfgsd" THEN "gfdsd" 
... (I am doing in batches of 1000 case statements at a time) 
ELSE code 

답변

9

case 문이 검색되기 때문에, 시간을 추가한다.

해결책? 쌍을 임시 테이블에 저장하십시오. . . 색인으로 그래서 :

create temporary table code_pairs (
    old_code varchar(255) not null primary key, 
    new_code varchar(255) 
); 

insert into code_pairs(old_code, new_code) 
    values ('akdsfj', 'kadjsf'), 
      ('asdf', 'ndgs'), 
      . . . ; 

그런 join으로 update를 사용 : 일치하는 코드가 아니라 다음 case 문을 통해 하나씩 검색, 인덱스를 사용하여 발견되기 때문에이 시간을 절약

update test_table tt join 
     code_paris cp 
     on tt.code = cp.old_code 
    set tt.code = cp.new_code; 

. 또한 일치하지 않는 행에 대해서는 갱신이 시도되지 않습니다. 일치하는 항목이없는 170,000 개의 행은 아마도 case 값의 전체 목록을 검토해야하기 때문에 쿼리에서 가장 느린 부분 일 것입니다.