0

我有一个包含 1600 万条记录的 DEV 数据库。我需要“屏蔽”个人数据列(姓名、地址、电话等)。我发现了一个很好的函数,可以很好地进行数据屏蔽如何使用 MySQL 函数生成有意义的测试数据

问题是,当我调用该函数时,它每秒只处理大约 30 条记录。这是放慢速度的方法。

有没有办法加快这个速度。也许创建一个临时表或其他东西。

这是调用该函数的 UPDATE 语句。

    UPDATE table1 
        SET first_name = (str_random('Cc{3}c(4)')),
        last_name = (str_random('Cc{5}c(6)')),
        email = (str_random('c{3}c(5)[.|_]c{8}c(8)@[google|yahoo|live|mail]".com"')),
        address1 = (str_random('d{3}d{1} Cc{5} [Street|Lane|Road|Park]')),
        city = (str_random('Cc{5}c(6)')),
        state = (str_random('C{2}')),
        zip = (str_random('d{5}-d{4}'))

谢谢!!

4

1 回答 1

0

如果您对程序生成的文本进行操作,而不是调用随机函数 7*16m 次,它可能会更快。

我检查了str_random您链接到的功能。(顺便说一句,这很聪明——很酷的东西)

它为字符串中的每个随机字符调用一次 RAND(),每次你说“从列表中选择”时调用一次。这是很多兰特。

我认为改进它的一种方法是创建和缓存(在表中)一大组随机字符,而不是为 5 个随机字符调用 rand(比如说)5 次,调用它一次以确定大字符串的偏移量随机废话,然后只增加它用来从字符串中提取的索引......(如果它需要连续一堆 - 它可以连续一次将它们全部拉出并多次增加偏移量)

父函数调用的函数可以替换为执行此操作的str_random_character函数,而不是将 rand 调用到数组中。

一段一次性的代码有点超出我的能力,但它可能会让你(或更好的 mysql 专家)走上一条加速这只小狗的道路(也许)。


一个不同的选择不是随机屏蔽所有数据......你能以某种方式转换数据吗?由于您不需要原始背面,因此您可以根据(单个)rand 调用旋转计数对数据中的每个字符执行类似凯撒密码的操作。(如果您分别旋转每个字符串中的大写、小写和数字,尽管由于随机旋转而不容易可逆,但数据将保持“正常”状态)——我不会在上面贴上安全标签,但它会要快很多,不容易逆转。

我想我有一个凯撒旋转器,如果它足够的话,它可以在某个地方做到这一点。

于 2014-08-28T19:16:02.283 回答