У меня есть PHP-скрипт, который очень быстро передает большое количество запросов в БД. БД MySQL ставит в очередь запросы по мере их поступления, если не может обрабатывать их с той же скоростью, с которой они передаются, или они теряются?
Моя программа написала и передала синтаксически правильные запросы в БД, но БД очень сильно отстает в плане информации, содержащейся в таблицах и количестве таблиц.
Пример кода (я немного новичок в PHP, поэтому мой код / стиль кодирования может быть ужасающим):
//If table has one primary key
$val = $tblColPkArray[0];
$pkInsert = ", PRIMARY KEY (". $val['COLUMN_NAME'] .")";
$pkColName = $val['COLUMN_NAME'];
$string = ltrim($string, ",");
$oneCreateTableQuery = $beginning . $string . $pkInsert . $end;
echo $oneCreateTableQuery . "\n";
$newLink->query($oneCreateTableQuery);
$pkValuesInOld = "SELECT " . $pkColName . " FROM " . $tables . ";";
$pkValsResult = $link->query($pkValuesInOld);
while($pkValues = $pkValsResult->fetch(PDO::FETCH_ASSOC))
{
$pkRowValuesQuery = "SELECT * FROM " . $tables . " WHERE " . $pkColName . " = '" . $pkValues[$pkColName] . "';";
echo $pkRowValuesQuery . "\n";
$valsOfPkInOldTable = $link->query($pkRowValuesQuery);
while($pkVals = $valsOfPkInOldTable->fetch(PDO::FETCH_ASSOC))
{
//var_dump($ckVals);
$insertBeginning = "INSERT INTO " . $tables . "(";
$insertValuesSection = ") VALUES (";
$insertEnd = ");";
$keys = "";
$rowValues = "";
foreach($pkVals as $key => $value)
{
$keys = $keys . ", " . $key;
$rowValues = $rowValues . ", '" . $value . "'";
}
$insertStatement = $insertBeginning . ltrim($keys, ",") . $insertValuesSection . ltrim($rowValues, ",") . $insertEnd;
echo $insertStatement . "\n";
$newLink->query($insertStatement);
}//While loop: Inserting values of old table into new table via INSERT INTO statement
//unset();
} //While loop: Selecting all values from old table based on PK values per table, pass result of that query to next while loop
Вы можете сделать это в одном запросе вместо вызова нескольких операторов вставки.
Например, вместо того, чтобы выполнять эти 3 запроса,
INSERT INTO table VALUES(1, 2);
INSERT INTO table VALUES(3, 4);
INSERT INTO table VALUES(5, 6);
...
Вы можете выполнить этот запрос:
INSERT INTO table VALUES(1, 2), (3, 4), (5, 6), ...;
Похоже, вы могли бы даже комбинировать INSERT и SELECT:
INSERT INTO table (...)
SELECT ... FROM ...;
Кроме того, ваши вложенные циклы выглядят так:
INSERT INTO table (...)
SELECT ... FROM ...
JOIN ...;
Это было бы до один позвонить ->query()
и устранить большую часть вашего кода.