繁体   English   中英

如何检查/更新数据库中包含大约一百万行的列?

[英]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 !="";

我将消除对“检查”的需要,并使其更快。

这样的四字符字符串最多不超过一百万。 因此,如果您“随机”生成重复项,将会有很多烦人的重复项。

相反,我建议

  1. 生成所有(或一百万个)
  2. 洗牌
  3. 将它们应用于您的表。

    • CONV(x, 10, 36)将根据x生成以36为底的值(0-9A-Z)。 但是,以下可能会更好...
    • 建立一个包含36行0..9,a..z的表。
    • CROSS JOIN自身4次以生成所有36 ^ 4连击。
    • ORDER BY RAND()将对它们进行洗牌而不会导致重复。
    • 多表UPDATE将使您可以将4个字符的字符串从一个表复制到另一个表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM