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编制索引?是,请在上添加索引ode>p.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