Как проверить / обновить столбцы в базе данных около миллиона строк?

0

У меня есть база данных 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? Или что делать?

  • 0
    Вы должны использовать процедуру хранения MySQL
  • 0
    Возможно, это единовременная вещь, чтобы заставить их всех иметь это, и где бы они ни были вставлены, также должны быть добавлены уникальные идентификаторы? Тогда тебе не пришлось бы это делать?
Показать ещё 13 комментариев
Теги:
performance
pdo

4 ответа

0

Я устраню необходимость в "проверке" и сделаю это быстрее.

Есть не более миллиона таких 4-символьных строк. Таким образом, будет некорректное количество дубликатов, если вы "произвольно" их генерируете.

Вместо этого я рекомендую

  1. Создайте все из них (или миллион из них)
  2. Перемешать их
  3. Примените их к своему столу.

    • CONV(x, 10, 36) генерирует значение base-36 (0-9A-Z) из x. Но, может быть, лучше...
    • Создайте таблицу с 36 строками 0..9, a..z.
    • CROSS JOIN присоединяйтесь к нему 4 раза, чтобы сгенерировать все 36 ^ 4 комбо.
    • ORDER BY RAND() будет перемешать их, не приводя к дублированию.
    • Многостраничный UPDATE позволит вам скопировать строку из 4-х символов из одной таблицы в другую.
0

Вы можете использовать предложение ниже обновления. Это позволит выбрать 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 !="";
0

Сначала вы должны указать unique or primary ограничение для столбца, который вы хотите быть уникальным.

После этого вы можете выполнить команду update

UPDATE TABLE_NAME SET COLMUN_NAME=generateRandomString() WHERE messageid !="";

0

Вы можете напрямую использовать SQL и создать простой хеш, основанный на некоторых данных в строке, например:

UPDATE table_name SET messageid = MD5(messageid) WHERE messageid !="";

Возможно, вы захотите сделать это партиями, поэтому добавьте LIMIT в оператор, т.е. LIMIT 0,1000, чтобы сделать кучу за раз.

  • 0
    «Этот процесс замедляется и занимает весь процессор по мере увеличения строк». qeuries с LIMIT также станут медленнее, если будут использованы большие числа смещений.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню