Php MySQL在更新大型表时失去连接
我有以下查询更新特定供应商的产品库存Php MySQL在更新大型表时失去连接,php,mysql,prestashop,Php,Mysql,Prestashop,我有以下查询更新特定供应商的产品库存 UPDATE ps_stock_available AS sa INNER JOIN ps_product AS p ON p.id_product = sa.id_product SET sa.quantity = 0, p.quantity = 0 WHERE p.id_supplier = 18 该查询适用于产品数量较少的供应商,但在超过1k产品的供应商中会遇到问题 /Lost connection
UPDATE
ps_stock_available AS sa
INNER JOIN
ps_product AS p
ON
p.id_product = sa.id_product
SET
sa.quantity = 0,
p.quantity = 0
WHERE
p.id_supplier = 18
该查询适用于产品数量较少的供应商,但在超过1k产品的供应商中会遇到问题
/Lost connection to MySQL server during query/
我没有访问配置文件的权限,因此我正在寻找一种减少处理所需时间的方法
是否有任何方法可以减少所需时间或多批次更新产品?如果有人熟悉,我正在使用prestashop CMS 我自己解决了这个问题 我正在批量更新数据库,而不是一次直接更新两个表 以下代码是用PHP编写的: 选择符合我的更新条件的所有ID(连接到数据库,执行查询) 将ID写入数组
$i=0;
$id;
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$id[$i]=$row["id_product"];
$i++;
}
} else {
echo "No products with chosen supplier in database.";
}
在循环thorugh数组时,我为每个ID创建特定的更新查询并执行它们
$arrlength = count($id);
for($x = 0; $x < $arrlength; $x++) {
$sql2=
"
UPDATE ps_stock_available
SET
quantity=0
WHERE id_product=".$id[$x]."
";
if ($conn->query($sql2) === TRUE) {
echo $x.", ";
}
$arrlength=计数($id);
对于($x=0;$x<$arrlength;$x++){
$sql2=
"
更新可用的ps_库存_
设置
数量=0
其中id_product=“.id[$x]”
";
if($conn->query($sql2)==TRUE){
echo$x.“,”;
}
每次更新数据库时检查mysql连接可能是明智的,只是为了确保它不会断开连接,但它现在可以工作。我自己解决了这个问题 我正在批量更新数据库,而不是一次直接更新两个表 以下代码是用PHP编写的: 选择符合我的更新条件的所有ID(连接到数据库,执行查询) 将ID写入数组
$i=0;
$id;
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
$id[$i]=$row["id_product"];
$i++;
}
} else {
echo "No products with chosen supplier in database.";
}
在循环thorugh数组时,我为每个ID创建特定的更新查询并执行它们
$arrlength = count($id);
for($x = 0; $x < $arrlength; $x++) {
$sql2=
"
UPDATE ps_stock_available
SET
quantity=0
WHERE id_product=".$id[$x]."
";
if ($conn->query($sql2) === TRUE) {
echo $x.", ";
}
$arrlength=计数($id);
对于($x=0;$x<$arrlength;$x++){
$sql2=
"
更新可用的ps_库存_
设置
数量=0
其中id_product=“.id[$x]”
";
if($conn->query($sql2)==TRUE){
echo$x.“,”;
}
每次我更新数据库时检查mysql连接可能是明智的,只是为了确保它不会断开连接,但它现在可以工作。:)尝试更新mysql服务器上的“连接读取超时”值 更改MySQL配置文件中的默认值(mysqld部分中的选项connect_timeout)- 如果您无法访问此文件,则可以使用以下语句设置此值-
SET GLOBAL connect_timeout=100;
尝试将该值设置为比当前值更大的值,然后查看是否有效,如果无效,请尝试增加该值。尝试更新MySQL服务器上的“连接读取超时”值 更改MySQL配置文件中的默认值(mysqld部分中的选项connect_timeout)- 如果您无法访问此文件,则可以使用以下语句设置此值-
SET GLOBAL connect_timeout=100;
尝试将该值设置为大于当前值的值,看看是否有效,如果无效,则尝试增加该值。您是否有数据库访问权限为这些表中的
id\u product
列编制索引?或者尝试对结果进行分页。@wogsland我有权访问数据库。我是否必须为两个表上的id\u product编制索引?是,请在sa.id\U product
和p.id\U supplier
。请注意,即使您无法跟踪当前连接的进度,查询仍将完成。但在这些列上添加索引将大大提高查询速度。如果执行此请从information\u schema.processlist WHERE命令中选择*p'
,您将看到所有未休眠的活动查询您是否有数据库访问权限为这些表中的id\u product
列编制索引?或者尝试对结果进行分页。@wogsland我有访问数据库的权限。我是否必须为两个表上的id\u product编制索引?是的,在p.id\u product
、sa.id\u product
和p上添加索引。id\u supplier
。请注意,即使您无法跟踪当前连接的进度,查询仍将完成。但在这些列上添加索引将大大提高查询速度。如果执行此选择*FROM information\u schema.processlist WHERE command!=“Sleep”
,您将看到所有未休眠的活动查询G