mysql - 使用 case 语句优化查询

标签 mysql sql database

我有一列代码。现在每个代码都已更改为其他代码。我正在尝试更新它。所以我在 mysql 中使用了 case 语句。但问题是,我有大约 250,000 行和 80,000 个唯一代码需要替换。并且 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'),
           . . . ;

然后使用 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 值列表。

关于mysql - 使用 case 语句优化查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39501092/

相关文章:

php - 在 MYSQL 中操作外键输出

php - sql排序数字然后按字母顺序

android - 在 2 个 android 应用程序之间共享 SQLite 数据库?

MySQL 将表连接到自身并比较结果

MYSQL GROUP BY 多个派生表?

php - 在没有 Cron 作业的情况下创建计划任务

mysql - 如何解决 left join with where 子句不起作用

mysql - 如何最佳地在 WHERE 子句中使用 COALESCE()?

mysql - SQL 列重复匹配不同的值

php - 使用 PHP 检查 MySQL 数据库是否为空