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

Запрос работает на поставщиков с небольшим количеством продуктов, но он застревает у поставщика более 1 тыс. Продуктов.

/Lost connection to MySQL server during query/ 

У меня нет доступа к файлам конфигурации, поэтому я ищу способ уменьшить время, необходимое для выполнения.

Есть ли способ уменьшить время или обновить продукты несколькими партиями? Я использую preashop CMS, если кто-то знаком с ним.

+2

У вас есть доступ к базе данных для индексирования столбца 'id_product' в этих таблицах? – wogsland

+0

Или попробуйте подкачку результатов. – Shadow

+0

@wogsland У меня есть доступ к базе данных. Должен ли я индексировать id_product на обе таблицы? – ph0enix993

ответ

0

Я решил проблему самостоятельно.

Вместо того, чтобы пытаться прямо обновить обе таблицы сразу, я обновляю базу данных партиями.

Следующий код прописан в PHP:

Выбирает все идентификаторы, которые соответствуют критериям для моего обновления (подключение к базе данных, выполнить запрос)

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 

идентификаторов Записи в массив

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

В то время, когда цикл loopugh массива я создаю конкретные запросы 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 (опция connect_timeout в туздЫ секции) -

[mysqld] 
connect_timeout=100 

Если этот файл не доступен для вас, то вы можете установить это значение, используя эту инструкцию -

SET GLOBAL connect_timeout=100; 

Попробуйте установить значение на что-то большее, чем текущее значение, и посмотрите, работает ли оно, попробуйте увеличить значение, если это не так.