以下是我的查询
UPDATE cdata AS gcd
LEFT JOIN tar AS ap
ON gcd.dialled
LIKE CONCAT(ap.prefix, '%')
SET gcd.prefix=ap.prefix, gcd.destination1=ap.destination
WHERE gcd.prefix=0;
这似乎超时了,我想知道是不是这样做了。 cdata有大约140000条记录,它搜索tar大约有25000条。所以我猜mysql正在为140000条记录中的每条记录进行25000次查找?
如果可能,我需要找到加快速度的方法。
感谢您的帮助
答案 0 :(得分:1)
这有点像黑客,应该是更好的方式,也许是UNION
?将其分为7个查询,每个可能的ap.prefix长度为1个:
UPDATE cdata AS gcd
JOIN tar AS ap
ON substring(gcd.dialled, 1, 3) = ap.prefix
SET gcd.prefix=ap.prefix, gcd.destination1=ap.destination
WHERE gcd.prefix=0
;
-- ...
UPDATE cdata AS gcd
JOIN tar AS ap
ON substring(gcd.dialled, 1, 9) = ap.prefix
SET gcd.prefix=ap.prefix, gcd.destination1=ap.destination
WHERE gcd.prefix=0
;
运行所有查询,它应该在合理的时间内更新所有数据。 (注意:我切换到JOIN
而不是LEFT JOIN
,以避免将NULL
放入之前为0的行中。
答案 1 :(得分:0)
这种做法是错误的。您永远不应对无限期数据使用UPDATE
查询。