我有一个PHP脚本设置,可以分析多个页面中分割的JSON文件。
此PHP脚本解析JSON并将其插入MySQL数据库。
在单个查询中...(没有TRUNCATE
语句):
if ($count > 0) {
//check toperform operation
foreach ($jsondecode as $entries) {
//getting variables here
$sql = "INSERT INTO table (title, handle, imagesrc)
VALUES ('".$title."', '".$handle."', '".$imagesrc."')";
if ($connect->query($sql) === TRUE) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . $connect->error;
}
}
}
使用script execution time: 16.451724052429
在multi_query ....:
if ($count > 0) {
$sql = "TRUNCATE table;";
foreach ($jsondecode as $entries) {
//getting variables here
$sql.= "INSERT INTO table (title, handle, imagesrc)
VALUES ('".$title."', '".$handle."', '".$imagesrc."')";
if (!$mysqli->multi_query($sql)) {
echo "Multi query failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
do {
if ($res = $mysqli->store_result()) {
var_dump($res->fetch_all(MYSQLI_ASSOC));
$res->free();
}
} while ($mysqli->more_results() && $mysqli->next_result());
}
}
成功结果script execution time: 278.05182099342
,差不多5分钟。
我要做的就是TRUNCATE
之前的INSERT
表格。
我将在一个Web服务器CRON作业上运行它,它将每12个小时执行一次这个脚本。
单个查询与多个查询之间显然存在如此巨大的执行时间差异......我能做些什么吗?
我唯一想到的是设置另一个CRON作业脚本,它每隔12小时执行一次TRUNCATE
语句,但在此主要运行之前1分钟。这看起来应该有用..但当然不理想,因为我不得不处理多个脚本而不只是一个。
答案 0 :(得分:1)
一个额外角色存在如此巨大差异的原因!
$sql.= "INSERT INTO table (title, handle, imagesrc)
VALUES ('".$title."', '".$handle."', '".$imagesrc."')";
您继续向现有查询添加新查询,但您继续在循环内执行该膨胀查询。它可能不是很明显,因为您没有正确缩进代码。所以这里的关键错误是缩进!!
您正在截断JSON中每行输入的表格,然后重新插入整个内容。
此外,这不是你应该使用多查询的情况。在循环外运行截断查询。然后在循环内运行insert查询。
正如其他人所指出的,构建具有多个VALUES集的单个插入查询可能会更快一些。或者,将事务自动提交关闭,然后在最后重新打开。
if ($count > 0) {
$connect->query('TRUNCATE `table`');
//check toperform operation
foreach ($jsondecode as $entries) {
//getting variables here
$sql = "INSERT INTO `table` (title, handle, imagesrc)
VALUES ('".$title."', '".$handle."', '".$imagesrc."')";
if ($connect->query($sql) === TRUE) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . $connect->error;
}
}
}