2017-02-17 25 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 

如果這個文件是不是你訪問的,那麼你可以使用此語句設置這個值

嘗試將值設置爲比當前值更多的值並查看它是否有效,如果不是,請嘗試增加值。