我需要一个高级(或至少比我自己更先进)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);
}
答案 0 :(得分:1)
35个查询不是问题。它应该在不到一秒的时间内运行。您的问题既不是PDO,也不是准备好的相关报表。这是你的查询运行缓慢。很可能你的桌子使用Innodb引擎,innodb_flush_log_at_trx_commit
设置为2以外的某个值。
因此,首先检查它是否确实是myisam。比仔细检查一下
然后在前面运行带EXPLAIN
的插入查询,并在控制台中运行它以查看数字。
乍一看,这绝对是你的疑问。你必须提出另一个问题,没有所有这些准备的东西,但仅在查询上,提供示例值和EXPLAIN EXTENDED
查询的结果,然后是show warnings
命令,以显示已翻译的查询。 / p>
我觉得mysql正在将子查询转换为连接和未经优化的子查询。