PHP MySQL 正在传递大量查询,
PHP MySQL large quantity of queries being passed,
我有一个 PHP 脚本,可以非常快速地将大量查询传递给数据库。如果 MySQL 数据库无法以与传递它们相同的速度处理它们,那么它是否会在查询进入时将其排队,或者它们会丢失?
我的程序编写了句法正确的查询并将其传递给数据库,但数据库在表中包含的信息和表的数量方面远远落后。
一些示例代码(我对 PHP 有点陌生,所以我的 code/coding 风格可能很恐怖):
//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), ...;
看起来你甚至可以结合插入和 SELECT:
INSERT INTO table (...)
SELECT ... FROM ...;
此外,您的嵌套循环看起来可能有效:
INSERT INTO table (...)
SELECT ... FROM ...
JOIN ...;
这将减少 一次 调用 ->query()
并消除大部分代码。
我有一个 PHP 脚本,可以非常快速地将大量查询传递给数据库。如果 MySQL 数据库无法以与传递它们相同的速度处理它们,那么它是否会在查询进入时将其排队,或者它们会丢失?
我的程序编写了句法正确的查询并将其传递给数据库,但数据库在表中包含的信息和表的数量方面远远落后。
一些示例代码(我对 PHP 有点陌生,所以我的 code/coding 风格可能很恐怖):
//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), ...;
看起来你甚至可以结合插入和 SELECT:
INSERT INTO table (...)
SELECT ... FROM ...;
此外,您的嵌套循环看起来可能有效:
INSERT INTO table (...)
SELECT ... FROM ...
JOIN ...;
这将减少 一次 调用 ->query()
并消除大部分代码。