如果我尝试
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引擎)
答案 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;
与查询相关的性能问题与表格之间的笛卡尔积相关