2016-09-14 43 views
4

我有一个包含代码的列。现在每个代码已经被更改为其他内容。我正在尝试更新它。所以我在mysql中使用了case语句。但问题是,我有大约250,000行和80,000个需要更换的唯一代码。案件陈述花费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'), 
      . . . ; 

然后用updatejoin

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

这是因为匹配代码使用的是索引中找到,而不是寻找一个接一个通过case声明节省您的时间。另外,在没有匹配的行上不会尝试更新。 170,000行不匹配可能是查询中最慢的部分,因为它们需要遍历整个值为case的列表。