2017-02-17 53 views
1

我有以下查询更新特定供应商的产品库存。MySQL在更新大型表时丢失连接

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

你有索引数据库的访问'这些表中的列id_product'? – wogsland

+0

或尝试分页的结果。 – Shadow

+0

@wogsland我有权访问数据库。我是否必须在两个表上都编制id_product? – ph0enix993

回答

0

我解决我自己的问题。

,而不是试图直上一次更新我分批更新数据库中两个表。

下面的代码在PHP writen:

选择其适合的标准,我更新所有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."; 
    } 

虽然循环thorugh阵列我创建特定UPDATE查询执行它们每个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.", "; 
} 

它很可能是聪明的每一个我更新数据库的时间来检查MySQL连接,只是为了确保它没有断开连接,但它适用于现在。 :)

0

尝试更新你的MySQL服务器“连接读取超时”的值。在MySQL配置文件

更改默认值(mysqld中的部分选项connect_timeout) -

SET GLOBAL connect_timeout=100; 
-

[mysqld] 
connect_timeout=100 

如果这个文件是不是你访问的,那么你可以使用此语句设置这个值

尝试将值设置为比当前值更多的值并查看它是否有效,如果不是,请尝试增加值。