MYSQL маскирует данные от обновления очень медленно на больших БД
У меня есть БД DEV с 16 миллионами записей. Мне нужно "замаскировать" столбцы личных данных (имя, адрес, телефон и т. Д.). Я нашел замечательную функцию, которая прекрасно маскирует данные. Как генерировать значимые тестовые данные с помощью функции 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}'))
Спасибо!!
1 ответ
Вместо того, чтобы вызывать случайную функцию 7*16m раз, вероятно, будет быстрее, если вы оперируете процедурно сгенерированным текстом.
Я проверил str_random
функция, с которой вы связаны. (Это очень умно, кстати - классные вещи)
Он вызывает RAND() один раз для каждого случайного символа в строке и каждый раз, когда вы говорите "выбрать из списка". Это много рандов.
Я думаю, что один из способов улучшить это - создать и кэшировать (в таблице) большой набор случайных символов, и вместо того, чтобы вызывать rand (скажем) 5 раз для 5 случайных символов, вызывать его один раз, чтобы определить смещение в большую строку случайного дерьма, затем просто увеличиваем индекс, который он использует для извлечения из строки... (если ему нужна связка в строке - он может просто вытянуть их все сразу в строке и увеличить значение смещения на несколько раз)
str_random_character
функция, которую вызывает родительская функция, может быть заменена чем-то, что делает это, вместо вызова rand в массив.
Это немного за мной для одноразового кода, но это может поставить вас (или лучшего гуру mysql) на путь ускорения этого щенка (возможно).
Другой вариант - вместо случайной маскировки всех данных... можете ли вы каким-то образом преобразовать данные? Так как вам не нужна оригинальная обратная сторона, вы можете сделать что-то вроде шифра Цезаря для каждого символа в их данных на основе (одного) рандового вызова для счетчика вращения. (Если вы поворачиваете верх, опускание и цифры в каждой строке отдельно, данные будут выглядеть "нормальными", несмотря на то, что они не будут легко обратимыми из-за случайного поворота) - я бы не стал наклеивать наклейку SECURE, но это быть намного быстрее и не легко повернуть вспять.
Я думаю, что у меня есть ротатор Цезаря, который делает это где-то, если этого достаточно.