0

1,600 万件のレコードを持つ DEV DB があります。個人データ (名前、住所、電話番号など) の列を「マスク」する必要があります。私は、MySQL関数を使用して意味のあるテストデータを生成する方法を見事にデータマスキングする素晴らしい関数を見つけました。

問題は、関数を呼び出すと、1 秒あたり約 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() を 1 回呼び出し、「リストから選択」と言うたびに 1 回呼び出します。それはたくさんのランドです。

それを改善する1つの方法は、ランダムな文字の大きなセットを作成して(テーブルに)キャッシュし、5つのランダムな文字に対してrandを(たとえば)5回呼び出す代わりに、1回呼び出して大きな文字列へのオフセットを決定することだと思いますランダムながらくたの場合は、文字列からプルするために使用するインデックスをインクリメントするだけです...(連続してたくさん必要な場合-一度にすべてを一度にプルして、オフセットをマルチインクリメントできます)

str_random_character親関数が呼び出す関数は、rand を配列に呼び出す代わりに、これを行う何かに置き換えることができます。

使い捨てのコードについては、私にはちょっと無理ですが、あなた (またはより優れた mysql の第一人者) が、この子犬を高速化するための道を歩むかもしれません (たぶん)。


別のオプションは、すべてのデータをランダムにマスキングするのではなく...何らかの方法でデータを変換できますか? 元のバックは必要ないので、ローテーション カウントの (単一の) rand 呼び出しに基づいて、データ内の各文字に対してシーザー暗号のようなことを行うことができます。(各文字列の上限、下限、数字を個別に回転させると、ランダム化された回転のために簡単に元に戻すことはできませんが、データは「通常」のように見えます) -- 私は SECURE ステッカーを貼りませんが、はるかに速く、元に戻すのは簡単ではありません。

十分であれば、どこかでそれを行うシーザーローテーターがあると思います。

于 2014-08-28T19:16:02.283 に答える