[英]How to check/update columns in a database contains about million rows?
我的MYSQL数据库包含大约一百万(1,000,000)行,我想检查所有行并根据条件进行更新,例如,我运行这样的SQL语句:
select messageid from messages where messageid !=""
然后,我获取所有ID并将其存储在变量中:
$existMessages;
然后我生成一个4个字符的字符串0-9a-z:
function generateRandomString($length = 4) {
return substr(str_shuffle(str_repeat($y='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($y)) )),1,$length);
}
然后,在检查生成的ID是否唯一之后,用生成的字符串更新现有ID。
随着行数的增加,此过程会变慢,并占用整个CPU。
有更好的方法吗? 像直接在MYSQL中使用SQL语句一样? 还是该怎么办?
您首先应该在要唯一的列上放置unique or primary
约束。
之后,您可以执行更新命令
UPDATE TABLE_NAME SET COLMUN_NAME=generateRandomString() WHERE messageid !="";
您可以直接使用SQL,并根据行中的某些数据创建一个简单的哈希,例如:
UPDATE table_name SET messageid = MD5(messageid) WHERE messageid !="";
您可能希望分批执行此操作,因此请在语句中添加一个LIMIT,即。 一次只能做1900个限制。
您可以在下面使用update子句。 这将为大写和小写以及0-9选择4个随机字母和数字。
update table_name cross join (select
@chars:='1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIKLMNOPQRSTUVWXYZ') tab
set messageid = concat(substring(@chars, floor(rand()*61) + 1, 1),
substring(@chars, floor(rand()*61) + 1, 1),
substring(@chars, floor(rand()*61) + 1, 1),
substring(@chars, floor(rand()*61) + 1, 1)
)
where messageid !="";
我将消除对“检查”的需要,并使其更快。
这样的四字符字符串最多不超过一百万。 因此,如果您“随机”生成重复项,将会有很多烦人的重复项。
相反,我建议
将它们应用于您的表。
CONV(x, 10, 36)
将根据x生成以36为底的值(0-9A-Z)。 但是,以下可能会更好... CROSS JOIN
自身4次以生成所有36 ^ 4连击。 ORDER BY RAND()
将对它们进行洗牌而不会导致重复。 UPDATE
将使您可以将4个字符的字符串从一个表复制到另一个表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.