我有一个包含1600万(ish)记录的DEV DB。我需要“屏蔽”个人数据列(姓名,地址,电话等)。我找到了一个很好的函数,可以很好地进行数据屏蔽Howto generate meaningful test data using a MySQL function。
问题是,当我调用该函数时,它每秒只处理大约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}'))
谢谢!
答案 0 :(得分:0)
如果您对程序生成的文本进行操作,则可能会更快地调用7 * 16m的随机函数。
我查看了您关联的str_random
功能。 (那是非常聪明的 - 很酷的东西)
它为字符串中的每个随机字符调用一次RAND(),每次调用“从列表中选择”。那是很多好事。
我认为改进它的一种方法是创建和缓存(在表格中)一大组随机字符,而不是为5个随机字符调用rand(比如说)5次,调用它一次以确定偏移到随机垃圾的大串,然后只是增加它用来从字符串中提取的索引...(如果它需要一排连续 - 它可以一次连续拉出它们并多次递增偏移量)
父函数调用的str_random_character
函数可以由执行此操作的函数替换,而不是将rand调用为数组。
对于一段丢失的代码来说,这有点超出我的范围,但它可能会让你(或更好的mysql大师)加速这条小狗的速度(也许)。
一个不同的选择不是随机屏蔽所有数据......你能以某种方式转换数据吗?由于您不需要原始背面,因此您可以根据(单个)rand调用旋转计数对其数据中的每个字符执行类似caesar密码的操作。 (如果你分别旋转每个字符串中的鞋面,下降和数字,数据将保持看起来“正常”,尽管由于随机旋转而不容易翻转) - 我不会在它上面贴上SECURE标签,但它会要快得多,而且容易反转。
我认为我有一个Caesar旋转器,只要它足够就能在某处完成。