РЕДАКТИРОВАННЫЙ РЕГЕКС на вопрос комментария
Я ломаю голову, пытаясь ускорить этот скрипт на моем сервере MySQL. Он работает под управлением Ubuntu, и я следовал советам каждой статьи по настройке my.cnf, что касается innodb:
innodb-flush-method = O_DIRECT
innodb-log-files-in-group = 2
innodb-log-file-size = 256M
innodb-flush-log-at-trx-commit = 0
innodb-file-per-table = 1
innodb-buffer-pool-size = 6G
аппаратное обеспечение на сервере немного старое, но оно имеет терабайтный жесткий диск и 8 ГБ оперативной памяти. Этот же код может пройти более миллиона строк менее чем за 2 минуты на моем MacBook Pro …. единственная проблема может быть аппаратная? На настройке моего сервера это занимает более часа. Ниже приведен PHP, я просто пытаюсь удалить любой альфа-символ из 4 столбцов. Каждый из этих столбцов индексируется, но даже попытка отбросить индексы перед каждым обновлением, похоже, не вносит никаких изменений.
$cleanSelect = mysqli_query($conn,"SELECT id, cleanShipment, cleanBOL, cleanInvoice, cleanBatch from MASTER_dups where
division in (select division from MASTER_import)
AND (cleanShipment REGEXP '[A-Za-z]'
OR cleanInvoice REGEXP '[A-Za-z]'
OR cleanBatch REGEXP '[A-Za-z]'
OR cleanBOL REGEXP '[A-Za-z]')");
while ($row = mysqli_fetch_array($cleanSelect)) {
$id = $row['id'];
$cleanShipment = $row['cleanShipment'];
$cleanBOL = $row['cleanBOL'];
$cleanBatch = $row['cleanBatch'];
$cleanInvoice = $row['cleanInvoice'];
$pattern = '/[A-Za-z]/';
$cleanShipment = preg_replace($pattern, '', $row['cleanShipment']);
$cleanBOL = preg_replace($pattern, '', $row['cleanBOL']);
$cleanBatch = preg_replace($pattern, '', $row['cleanBatch']);
$cleanInvoice = preg_replace($pattern, '', $row['cleanInvoice']);
$cleanShipment = !empty($cleanShipment) ? "$cleanShipment" : "";
$cleanBOL = !empty($cleanBOL) ? "$cleanBOL" : "";
$cleanBatch = !empty($cleanBatch) ? "$cleanBatch" : "";
$cleanInvoice = !empty($cleanInvoice) ? "$cleanInvoice" : "";
$updateMasterDups =
"UPDATE MASTER_dups set cleanShipment = '$cleanShipment',
cleanBOL = '$cleanBOL',
cleanBatch = '$cleanBatch',
cleanInvoice = '$cleanInvoice'
where id = $id";
if (!mysqli_query($conn,$updateMasterDups))
{
echo("Error description: " . mysqli_error($conn)."<br>".$updateMasterDups."<br>");
}
}
Задача ещё не решена.
Других решений пока нет …