mysql性能为什么更新1000行需要比更新一行多3-4倍* 1000

时间:2018-04-08 19:17:16

标签: mysql sql

如果我尝试

UPDATE my_table t1, my_table t2 
SET 
    t1.hash1 =  UNHEX(MD5(t2.original)),
    t1.hash2 =  UNHEX(MD5(t2.translated))
WHERE t1.id = 1;

我得到了这个结果

Query OK, 1 row affected (0.09 sec)

但如果我试试这个:

UPDATE my_table t1, my_table t2 
SET 
    t1.hash1 =  UNHEX(MD5(t2.original)),
    t1.hash2 =  UNHEX(MD5(t2.translated))
WHERE t1.id < 1000;

结果是:

Query OK, 998 rows affected (5 min 13.66 sec)

预计0.09 * 1000/60 = 1.5分钟

我首先使用https://dba.stackexchange.com/a/124733/146439

SET GLOBAL join_buffer_size = 1024 * 1024 * 42;

还有其他技巧可以改善更新时间吗? (MyISAM引擎)

2 个答案:

答案 0 :(得分:4)

这是一个交叉连接,一个笛卡尔积:

UPDATE my_table t1, my_table t2 
SET 
    t1.hash1 =  UNHEX(MD5(t2.original)),
    t1.hash2 =  UNHEX(MD5(t2.translated))
WHERE t1.id < 1000;

您可以通过执行以下操作来计算尝试更新的次数:

select count(*)
from my_table t1 cross join my_table t2
where t1.id < 1000;

如果答案是数百万,我不会感到惊讶。

您可以通过以下方式更快地获得计数:

select sum( id < 1000) * count(*)
from my_table ;

道德? 从不FROM子句中使用逗号。 始终使用正确的JOIN语法。

答案 1 :(得分:2)

查看您的查询似乎您不需要自我加入,只需要更新

UPDATE my_table t1
SET 
    t1.hash1 =  UNHEX(MD5(t1.original)),
    t1.hash2 =  UNHEX(MD5(t1.translated))
WHERE t1.id < 1000;

与查询相关的性能问题与表格之间的笛卡尔积相关