0

以下是我的查询

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;

这似乎超时了,我想知道是不是 LIKE 正在这样做。cdata 有大约 140000 条记录,它对 tar 的搜索大约有 25000 条。所以我猜 mysql 正在为 140000 条记录中的每一条进行 25000 次查找?

如果可能的话,我需要找到一种方法来加快速度。

谢谢你的帮助

4

2 回答 2

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 的行)。

于 2013-07-31T18:18:40.423 回答
0

This approach is wrong. You should never use UPDATE queries on indefinite data.

于 2013-07-31T17:08:37.530 回答