Mysql 基于case语句的查询优化

Mysql 基于case语句的查询优化,mysql,sql,database,Mysql,Sql,Database,我有一列代码。现在,每个代码都已更改为其他代码。我正在尝试更新它。所以我在mysql中使用了case语句。但问题是,我有大约250000行和80000个需要替换的唯一代码。而case语句的执行大约需要10分钟。 任何更好的方法都可以做到这一点 我的查询如下所示: UPDATE test_table SET code = CASE WHEN code = "akdsfj" THEN "kadjsf" WHEN code = "asdf" THEN "ndgs" WHEN code = "hfgsd

我有一列代码。现在,每个代码都已更改为其他代码。我正在尝试更新它。所以我在mysql中使用了
case
语句。但问题是,我有大约250000行和80000个需要替换的唯一代码。而case语句的执行大约需要10分钟。 任何更好的方法都可以做到这一点

我的查询如下所示:

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

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'),
           . . . ;
然后将
update
join
一起使用:

update test_table tt join
       code_paris cp
       on tt.code = cp.old_code
    set tt.code = cp.new_code;
这节省了您的时间,因为匹配的代码是使用索引找到的,而不是通过
case
语句逐个搜索。此外,不会尝试对不匹配的行进行更新。不匹配的170000行可能是查询中最慢的部分,因为它们需要遍历整个
case
值列表