原标题:如何更快随机UPDATE?
导读
UPDATE + RAND()怎么可以更快?
有时候,我们随机更新几行数据,可能会下意识的直接写成下面的SQL:
[yejr@imysql]> UPDATE t1 SET c1 = ? WHERE id = ROUND(RAND() * 102400);
不过你可能不知道,这个SQL的效率极低,需要进行全表扫描,因为无法使用索引:
[yejr]@[imysql.com]> EXPLAIN UPDATE t1 SET c1 = 3 WHERE id = ROUND(RAND() * 102400);*************************** 1. row *************************** id: 1 select_type: UPDATE table: t1 partitions: NULL type: ALLpossible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 102400 filtered: 100.00 Extra: Using where
这就尴尬了。
关注我网站(http://imysql.com)的同学,可能还记得我以前还写过一个关于随机排序的分享:[MySQL优化案例]系列 — RAND()优化。可以借鉴这篇文章的思路,把上面的SQL用JOIN改造一下:
[yejr@imysql]> EXPLAIN UPDATE t1, (SELECT ROUND(RAND() * (SELECT MAX(id) FROM t1)) AS rndid) t2 SET t1.c1=3 WHERE t1.id=t2.r