【问题标题】:MYSQL masking data from update very slow on large DBMYSQL 屏蔽数据在大型数据库上的更新速度非常慢
【发布时间】:2014-08-28 19:10:45
【问题描述】:

我有一个包含 1600 万条记录的 DEV 数据库。我需要“屏蔽”个人数据列(姓名、地址、电话等)。我发现了一个很好的函数,可以很好地完成数据屏蔽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}'))

谢谢!!

【问题讨论】:

  • 任何随机的东西在 MySQL 中天生就很慢。据我所知,您无法加快速度。
  • 也许按程序而不是随机生成项目?
  • 是的影子,没错。
  • 对不起(在您回答时编辑了我的评论)...例如,而不是基于格式化字符串的随机值 - 使用基于 id 生成相同 gobbledygook 字符串的算法? .. 使用散列,然后将散列字符串中的位抓取到格式化程序中?
  • 我理解这个概念,但不知道如何在 MYSQL 中做到这一点

标签: mysql data-masking


【解决方案1】:

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

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

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

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

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

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


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

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

【讨论】:

  • 我很想看看凯撒密码。更新已经运行了 23 小时......呃......
猜你喜欢
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-07
  • 2020-08-30
  • 2020-04-27
  • 1970-01-01
相关资源
最近更新 更多