在PHP循环中插入数据时优化PDO功能

时间:2015-09-14 12:36:36

标签: php mysql

我需要一个高级(或至少比我自己更先进)SQL / PDO工程师的建议。

我有一个关联数组,长度为7个键。在每个子数组中包含5个元素,其中一个是包含3个元素的数组。

目前,我还使用内部循环遍历此数组,更新数据库。它完美无瑕。我唯一的问题是速度。目前运行大约需要15-20秒。这是一个问题,因为它在一个页面上运行4次,导致执行时间超过60秒。

我在绑定参数中使用PDO。任何人都可以阐明如何进一步优化这个查询吗?

try {
    $dbh = $myDBConn;
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $stmt = $dbh->prepare("INSERT IGNORE INTO myTable1 (ID, Col1, Col2, Col3, Col4, Col5, Col6, Col7, Col8, Col9, Col10)
        SELECT myTable2.ID, :color, :make, NULL, :model, :height, :width, NULL, NULL, NULL, NULL
        FROM myTable2
        WHERE myTable2.ID IN (SELECT myTable3.ID FROM myTable3
        WHERE myTable3.Col2 = :color
        AND Col4 = :Height AND Col5 = :Width)");

    foreach ($myArray as $key => $val) {
        $stmt->bindParam(':Height', $val1['height'], PDO::PARAM_INT, 11);
        $stmt->bindParam(':Width', $val1['width'], PDO::PARAM_INT, 11);
        $stmt->bindParam(':make', $val1['make'], PDO::PARAM_INT, 6);
        $stmt->bindParam(':color', $val1['color'], PDO::PARAM_STR);

        foreach($myArray['nested'] as $key2 => $val2){
            $stmt->bindParam(':height', $val2['height'], PDO::PARAM_INT, 11);
            $stmt->bindParam(':width', $val2['width'], PDO::PARAM_INT, 11);
            $stmt->bindParam(':model', $val2['model'], PDO::PARAM_STR);

            $stmt->execute();
        }
    }

    $dbh = null;

} catch (PDOException $e) {
    print($e->getMessage);
}

1 个答案:

答案 0 :(得分:1)

35个查询不是问题。它应该在不到一秒的时间内运行。您的问题既不是PDO,也不是准备好的相关报表。这是你的查询运行缓慢。很可能你的桌子使用Innodb引擎,innodb_flush_log_at_trx_commit设置为2以外的某个值。

因此,首先检查它是否确实是myisam。比仔细检查一下 然后在前面运行带EXPLAIN的插入查询,并在控制台中运行它以查看数字。

乍一看,这绝对是你的疑问。你必须提出另一个问题,没有所有这些准备的东西,但仅在查询上,提供示例值和EXPLAIN EXTENDED查询的结果,然后是show warnings命令,以显示已翻译的查询。 / p>

我觉得mysql正在将子查询转换为连接和未经优化的子查询。