2014-08-28 121 views
0

我有一個具有1600萬(ish)記錄的DEV DB。我需要'掩飾'個人數據列(名稱,地址,電話等)。我發現了一個很好的功能,可以很好地完成數據屏蔽Howto generate meaningful test data using a MySQL functionMYSQL屏蔽更新大數據庫上的數據非常慢

問題是,當我調用函數時,它每秒只能處理約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

任何隨機事件在MySQL中本質上都很慢。就我所知,沒有什麼可以加快速度的。 – ydaetskcoR 2014-08-28 19:13:14

+0

也許程序性地而不是隨機地生成項目? – 2014-08-28 19:18:02

+0

是暗影,這是正確的。 – GreetRufus 2014-08-28 19:18:43

回答

0

而不是調用一個7 * 16m的隨機函數,如果您使用程序生成的文本進行操作,它可能會更快。

我檢出了你鏈接到的str_random函數。 (這是非常聰明的btw - 很酷的東西)

它爲字符串中的每個隨機字符調用一次RAND(),每次你說「從列表中選擇」時調用一次。這是很多的分歧。

我認爲改進它的一種方法是創建並緩存(在一個表中)一大組隨機字符,而不是爲5個隨機字符調用rand(比如說)5次,調用它來確定一個偏移量到隨機垃圾的大字符串中,然後只增加它用來從字符串中拉出的索引......(如果它需要一行一堆 - 它可以一次將它們全部拖入一行並多次增加偏移量)

父函數調用的str_random_character函數可以替換爲執行此操作的某個函數,而不是將rand函數調用到數組中。

這是一個超出我的代碼,但它可能會讓你(或更好的mysql大師)在加速這隻小狗(也許)的道路上有點超出我。


不同的選項會,而不是隨機屏蔽所有的數據...你以某種方式轉換數據?既然你不需要原始的背景,你可以在數據的每個字符上做一些凱撒密碼,這是基於一個(單個)rand調用旋轉計數。 (如果分別旋轉每個字符串中的鞋幫,鞋底和數字,數據將保持「正常」,儘管由於隨機旋轉不易翻轉) - 我不會在它上面打一個SECURE貼紙,但它會要快很多,而不是容易反轉。

我想我有一個凱撒旋轉器,它可以在某個地方做到這一點。

+0

我希望看到凱撒密碼。更新已經運行了23個小時.....呃....... – GreetRufus 2014-08-29 12:52:49