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

在PHP循环中插入数据时优化PDO函数,php,mysql,Php,Mysql,我需要高级(或至少比我更高级)SQL/PDO工程师的建议 我有一个关联数组,长度为7个键。在每个子数组中包含5个元素,其中一个是包含3个元素的数组 目前,我使用一个内部循环遍历这个数组,更新数据库。它工作完美。我唯一的问题是速度。目前运行大约需要15-20秒。这是一个问题,因为它在一个页面上运行4次,导致执行时间超过60秒 我在绑定参数中使用PDO。有人能告诉我如何进一步优化这个问题吗 try { $dbh = $myDBConn; $dbh->setAttribute(P

我需要高级(或至少比我更高级)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);
}

35查询不是问题。它应该在不到一秒钟的时间内运行。您的问题与PDO或准备好的声明无关。是您的查询运行缓慢。您的表很可能正在使用Innodb引擎,并在提交时将Innodb刷新日志设置为2以外的值

因此,首先检查它是否确实是myisam。然后再检查一遍。
然后使用
EXPLAIN
预先运行插入查询,并在控制台中运行它以查看数字

再看一眼,这肯定是你的问题。您必须提出另一个问题,没有所有这些准备好的内容,但仅限于查询,提供示例值和
EXPLAIN EXTENDED
查询的结果,然后是
show warnings
命令,以显示已翻译的查询


我有一种感觉,mysql正在将您的子查询转换为join和未优化的子查询。

快速思考-如果您使用INNODB引擎,将整个事务包装在一个事务中并提交一次会有帮助吗?@markdwhite不幸的是,它使用的是
MyISAM
。这似乎更适合于@Peter-好吧,根据给定的代码,您可以在myTable2和myTable3上检查更好的索引,如果合适的话,可以使用组合索引。虽然(对不起)我觉得它有一种代码气味。您是否试图将此解决方案融入糟糕的数据库设计中?是的,我的处境是,完全的数据重新结构是不可能的,但他们需要的是他们的数据无法自然结构化处理的内容。通常,循环中的循环意味着麻烦。谢谢。绝对是myisam。我对模式和表运行了SQL解释。至于35个查询,实际上是105个(7x5x3),ID在
in()
条件中大约是1000个。这等于1000个插入乘以105。公平地说,这是一次相当激烈的更新。对于这种查询,您认为什么时间尺度是可以接受的?在一个理想的世界里,我希望它能保持在10秒以下。我有一个sqlite(我所知道的不同)数据库,它在事务时间小于1秒的情况下写入30.000条记录,所以10秒没有事务听起来是正确的,这取决于查询的复杂性和所花费的cpu时间。没有交易系统,提高速度的可能性很小。是否无法将该表转换为支持事务的表?