MySQL multi_query非常慢,是简单截断查询的替代方法吗?

时间:2016-11-13 23:52:16

标签: php mysql json cron

我有一个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分钟。这看起来应该有用..但当然不理想,因为我不得不处理多个脚本而不只是一个。

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;
        }

    }
}