MySQL在更新大表时丢失了连接

时间:2017-02-17 14:13:27

标签: 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 to MySQL server during query/

我无法访问配置文件,因此我正在寻找一种方法来减少处理所需的时间。

有没有办法减少所需的时间或多批次更新产品?如果有人熟悉它,我会使用prestashop CMS。

2 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。

我没有尝试直接更新两个表,而是批量更新数据库。

以下代码在PHP中编写:

选择符合我更新条件的所有ID(连接到数据库,执行查询)

select ps_product.id_product FROM ps_product
INNER JOIN ps_stock_available on ps_product.id_product=ps_stock_available.id_product
WHERE ps_product.id_supplier=18

将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.";
    }

在循环遍历数组时,我正在为每个ID&创建特定的UPDATE查询。执行它们。

$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.", ";
}

每次我更新数据库时检查mysql连接可能是明智的,只是为了确保它不会断开连接,但它现在可以工作。 :)

答案 1 :(得分:0)

尝试更新&#39;连接读取超时&#39;的值在你的MySQL服务器上。

更改MySQL配置文件中的默认值(mysqld部分中的选项connect_timeout) -

[mysqld]
connect_timeout=100

如果您无法访问此文件,则可以使用此语句设置此值 -

SET GLOBAL connect_timeout=100;

尝试将值设置为超过当前值的某个值,看看它是否有效,如果没有,请尝试增加该值。