У меня есть база данных MYSQL, которая содержит около 1 миллиона (1 000 000) строк, я хочу проверить все строки и обновить некоторые в соответствии с условием. Так, например, я запускаю инструкцию SQL следующим образом:
select messageid from messages where messageid !=""
Затем я извлекаю все идентификаторы и сохраняю их в переменной:
$existMessages;
Затем я генерирую строку из 4 символов 0-9a-z:
function generateRandomString($length = 4) {
return substr(str_shuffle(str_repeat($y='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ceil($length/strlen($y)) )),1,$length);
}
Затем я обновляю существующие идентификаторы сгенерированными строками, после проверки уникальности сгенерированных идентификаторов.
Этот процесс становится медленнее и занимает весь процессор по мере увеличения рядов.
Есть ли лучший способ сделать это? Как использовать SQL-инструкции непосредственно в MYSQL? Или что делать?
Я устраню необходимость в "проверке" и сделаю это быстрее.
Есть не более миллиона таких 4-символьных строк. Таким образом, будет некорректное количество дубликатов, если вы "произвольно" их генерируете.
Вместо этого я рекомендую
Примените их к своему столу.
CONV(x, 10, 36)
генерирует значение base-36 (0-9A-Z) из x. Но, может быть, лучше...CROSS JOIN
присоединяйтесь к нему 4 раза, чтобы сгенерировать все 36 ^ 4 комбо.ORDER BY RAND()
будет перемешать их, не приводя к дублированию.UPDATE
позволит вам скопировать строку из 4-х символов из одной таблицы в другую.Вы можете использовать предложение ниже обновления. Это позволит выбрать 4 случайных буквы и цифры для нижнего и верхнего регистров и 0-9.
update table_name cross join (select
@chars:='1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIKLMNOPQRSTUVWXYZ') tab
set messageid = concat(substring(@chars, floor(rand()*61) + 1, 1),
substring(@chars, floor(rand()*61) + 1, 1),
substring(@chars, floor(rand()*61) + 1, 1),
substring(@chars, floor(rand()*61) + 1, 1)
)
where messageid !="";
Сначала вы должны указать unique or primary
ограничение для столбца, который вы хотите быть уникальным.
После этого вы можете выполнить команду update
UPDATE TABLE_NAME SET COLMUN_NAME=generateRandomString() WHERE messageid !="";
Вы можете напрямую использовать SQL и создать простой хеш, основанный на некоторых данных в строке, например:
UPDATE table_name SET messageid = MD5(messageid) WHERE messageid !="";
Возможно, вы захотите сделать это партиями, поэтому добавьте LIMIT в оператор, т.е. LIMIT 0,1000, чтобы сделать кучу за раз.