gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:51:08 25 4
gpt4 key购买 nike

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

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

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

我在绑定(bind)参数中使用 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_flush_log_at_trx_commit 设置为 2 以外的某个值。

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

再看一眼,这绝对是您的查询。你必须问另一个问题,没有所有这些准备好的东西,但只在查询中,提供示例值和 EXPLAIN EXTENDED 查询的结果,然后是 show warnings 命令, 以显示翻译后的查询。

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

关于php - 在 PHP 循环中插入数据时优化 PDO 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32564995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com